一开始synchronized锁的实现是基于操作系统的提供的信号量(PV操作)实现的,这个就叫重量级锁这个实现默认一定存在数据竞争,不管有没有数据竞争都枷锁,所以是一种悲观的线程安全实现方法。所有最大的问题就是性能问题,会有用户态到核心态转换等一系列比较消耗资源的操作。

  所以JDK6是专门做了优化,最常用的优化措施是不断地重试,比较消耗CPU,这个就叫自旋锁

  自旋锁比较消耗CPU所以又做了一些优化,JDK 6中对自旋锁的优化,引入了自适应的自旋。而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定的。有了自适应自旋,随着程序运行时间的增长及性能监控信息的不断完善,虚拟机对程序锁的状况预测就会越来越精准,虚拟机就会变得越来越“聪明”了。

  随着硬件指令集的发展,有了另一种更加优化的操作,就是在硬件层面实现一条能够保证多次内存操作的原子性的指令,例如:测试并设置(Test-and-Set)、获取并增加(Fetch-and-Increment)、交换(Swap)、比较并交换(Compare-and-Swap,下文称CAS)和加载链接/条件储存(Load-Linked/Store-Conditional,下文称LL/SC)。这样就能更加精确地控制互斥,在CPU底层执行指令时判断数据是否冲突,相当于把加锁的范围缩小了。依赖于这种CAS指令的锁就叫做轻量级锁

  轻量级锁涉及CAS操作,进一步优化就是去掉这一CAS操作,默认都是同一线程操作数据,这个就叫做偏向锁,意思是偏向第一个获得它的线程,偏向锁的实现和轻量级锁原理都差不多,都是修改线程栈中数据,只是修改的数据不一样。一旦出现另外一个线程去尝试获取这个锁的情况,偏向模式就马上宣告结束,转化为轻量级锁。

  实际运行时,synchronized锁升级就是偏向锁 轻量级锁 自旋锁 重量级锁 这么个过程。

  参考:《深入理解Java虚拟机》

原文地址:http://www.cnblogs.com/road2master/p/16877766.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性