Java多线程——锁概念与锁优化
为了性能与使用的场景,Java实现锁的方式有非常多。而关于锁主要的实现包含synchronized关键字、AQS框架下的锁,其中的实现都离不开以下的策略。
悲观锁与乐观锁
- 乐观锁。乐观的想法,认为并发读多写少。每次操作的时候都不上锁,直到更新的时候才通过CAS判断更新。对于AQS框架下的锁,初始就是乐观锁,若CAS失败则转化为悲观锁。
- 悲观锁。悲观的想法,认为并发写多读少。每次操作数据都上锁,即使别人想读也要先获得锁才能读。对于1.6以前的synchronized关键字,则是悲观锁的实现之一。
CAS无锁算法
全称为 Compare and Swap。CAS有三个操作数,内存值V,旧预期值(已获得的旧数据)A,修改新值B。当且仅当V与A的值相同(compare),才能把V替换为B(Swap)。其中Java中内存值可以通过volatile关键字标识获取,该关键词可以使变量对所有线程实时可见。
CAS算法在锁的应用非常广泛,java中concurrent包的高性能都是基于这个算法,可以说没有CAS,并发包的高性能也就不存在了。
重量级锁
悲观锁的一种。互斥使代码执行可以同步,但这种方式成本比较高,涉及到操作系统的调用阻塞,会造成一些系统资源的浪费。1.6以前,在Java中的即是监视器锁,把.java文件编程成.class文件后能看到synchronized关键字就是通过monitorenter和monitorexit这个两个字节码指令来实现的。
轻量级锁
由于在没有很多线程竞争的前提下,重量级锁会导致性能资源的浪费。每次判断是否无锁,无锁则建锁记录,有锁通过CAS去尝试获取锁(对比Mark Word)。该过程失败会让锁膨胀为重量级锁。
偏向锁
是轻量级锁的优化,适用于无多线程竞争。虽然轻量级锁在可以在较少线程竞争下,减少操作系统调用,减少互斥变量的产生。但在理想情况下,线程很少发生线程竞争,在轻量级锁中,还是会有比较多的CAS操作。在偏向锁中,有一个锁记录(Mark word)标记为偏向,指向当前线程。若该指向不变,则只需要判断记录是否有被切换。如果被切换了,尝试CAS替换指向,后续一直执行同步代码块。当CAS替换指向失败,则说明存在多线程竞争,此时锁会膨胀为轻量级锁。
自旋锁
是锁竞争失败后执行的策略之一,对应的有阻塞的锁。在线程竞争锁失败后,阻塞的锁会把线程阻塞,直到有信号唤起才能继续执行线程,此过程会涉及用户态与系统态的转换,产生性能消耗。而自旋锁在锁竞争失败后,会把线程做自旋,避免线程进入阻塞。在自旋过程中,会不断的尝试去竞争锁。
但如果线程一直自旋都获取不到锁,也会产生很多CPU的性能消耗,所以也有一个自适应的自旋锁(控制自旋的时间)解决这个问题。
更多技术文章、精彩干货,请关注
博客:zackku.com
微信公众号:Zack说码
[](http://qiniu.zackku.com/%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E5%BE%AE%E4%BF%A1%E6%A0%87%E5%87%86%E7%BB%BF%E7%89%88.png
最新文章
- AppCan学习笔记--数据存储及listview简单应用
- c#序列化json字符串及处理
- cmake 编译 c++ dll 的一个例子(更新1)
- pod install 错误 - incompatible character encodings: UTF-8 and ASCII-8BIT
- 【leetcode❤python】13. Roman to Integer
- 页面传值总结Block
- uva 10034 Problem A: Freckles
- Android之MaterialDesign应用技术
- Android双击退出
- 如何在Cocos2D游戏中实现A*寻路算法(五)
- .class文件查看
- 【hdu 6161】Big binary tree(二叉树、dp)
- Chrome中Vim插件cVim
- mysql获取相隔时间段的数据
- JDK源码分析(2)LinkedList
- 怎样从外网访问内网IIS?
- e信与酸酸结合开wifi使用路由器上网
- 转]GSM模块信号强度CSQ与RSSI的对应关系
- pgm8
- lnmp “.user.ini”无法删除解决方法
热门文章
- 如何在plsql/developer的命令窗口执行sql脚本
- iconfont字体图标
- eclipse 4.2生成wsdl 客户端
- UOJ#80 二分图最大权匹配 [模板题]
- HIT 1917 2—SAT
- [BZOJ1010][HNOI2008]玩具装箱toy 解题报告
- [bzoj2427][HAOI2010]软件安装——强连通分量+树形DP
- bzoj 1041 数学推理
- 四维偏序(K-D-Tree+rebuild)
- servlet(4) - servletAPI - 小易Java笔记