jdk1.6以上版本对synchronized优化

锁优化

自适应的自旋锁

自旋锁,为了让线程等待,让线程执行一个忙循环(自旋)。超过10次仍然没有成功获取锁,线程挂起。

自适应的自旋锁,前一次在同一个锁上的自旋时间和锁的拥有者的状态决定。在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在进行中,那么虚拟机就会认为这次自旋也很有可能再次成功,进而它将允许自旋等待持续相对更长的时间,比如100个循环。另一方面,如果对于某个锁,自旋很少成功获得过,那在以后获取这个锁时将可能省略掉自旋过程,以避免浪费处理器资源。

锁粗化

JVM检测一串操作都对同一对象加锁,把加锁同步的范围粗化到整个操作序列的外部。

锁消除

JVM在JIT编译运行时,通过对运行上下文的扫描,去除不可能存在共享数据竞争的锁。判断依据逃逸分析,判断堆上的数据不会被其它线程访问,那么把它们当做栈上的数据对待,认为它们是私有,同步加锁自然无须进行。

轻量级锁

jdk6引入。对于绝大部分锁,在整个生命周期内不会存在竞争。没有竞争,使用CAS消除互斥量。

偏向锁

jdk6引入。对于绝大部分锁,在整个生命周期内不会存在竞争,并且总由同一个线程多次获得。这个锁偏向第一个获取它的线程,如果接下来的执行中,该锁没有被其它的线程获取,则持有偏向锁的线程永远不需要再进行同步。

优化synchronized后锁状态级别由低到高顺序:

  1. 无锁
  2. 偏向锁
  3. 轻量锁
  4. 重量锁

https://www.jianshu.com/p/b516a981a1a7

原文地址:https://www.cnblogs.com/ivy-xu/p/12588169.html