锁优化
自适应的自旋锁
自旋锁,为了让线程等待,让线程执行一个忙循环(自旋)。超过10次仍然没有成功获取锁,线程挂起。
自适应的自旋锁,前一次在同一个锁上的自旋时间和锁的拥有者的状态决定。在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在进行中,那么虚拟机就会认为这次自旋也很有可能再次成功,进而它将允许自旋等待持续相对更长的时间,比如100个循环。另一方面,如果对于某个锁,自旋很少成功获得过,那在以后获取这个锁时将可能省略掉自旋过程,以避免浪费处理器资源。
锁粗化
JVM检测一串操作都对同一对象加锁,把加锁同步的范围粗化到整个操作序列的外部。
锁消除
JVM在JIT编译运行时,通过对运行上下文的扫描,去除不可能存在共享数据竞争的锁。判断依据逃逸分析,判断堆上的数据不会被其它线程访问,那么把它们当做栈上的数据对待,认为它们是私有,同步加锁自然无须进行。
轻量级锁
jdk6引入。对于绝大部分锁,在整个生命周期内不会存在竞争。没有竞争,使用CAS消除互斥量。
偏向锁
jdk6引入。对于绝大部分锁,在整个生命周期内不会存在竞争,并且总由同一个线程多次获得。这个锁偏向第一个获取它的线程,如果接下来的执行中,该锁没有被其它的线程获取,则持有偏向锁的线程永远不需要再进行同步。
优化synchronized后锁状态级别由低到高顺序:
- 无锁
- 偏向锁
- 轻量锁
- 重量锁