系列文章目录
参考文献:
https://blog.csdn.net/weixin_42351206/article/details/122199371
https://blog.csdn.net/weixin_45794641/article/details/123255683
前言
在jdk1.5之前,synchronized确实是重量级锁,之后,它便没这么“重”了。synchronized的锁有4种状态:无锁状态、偏向锁状态、自旋锁状态(轻量级锁状态)、重量级锁状态。锁可以升级,但不能降级,但是偏向锁可以被重置成无锁状态。
一、偏向锁
线程大多时候是不存在锁竞争的,常常是一个线程多次获得同一个锁,因此如果每次都要竞争锁会增大很多没有必要的代价,为了降低获取锁的代价,才引入的偏向锁。引入偏向锁的目的:为了在无多线程竞争的情况下尽量的减少不必要的轻量级锁执行路线。
如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。
1. 偏向锁的原理和升级的过程
关于锁的原理及升级过程的详细信息:synchronized的锁升级过程
2. 偏向锁的释放
偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程不会主动去释放偏向锁。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态,撤销偏向锁后恢复到未锁定或轻量级锁(的状态。
二、自旋锁(轻量级锁)
在偏向锁的基础上,如果在运行过程中,遇到其他线程抢占锁,则持有偏向锁的线程会被挂起JVM会消除它身上的偏向锁,将锁升级到自旋锁(轻量级锁)。
自旋锁(轻量级锁)不会阻塞线程,但会造成CPU的消耗。
1. 自旋锁(轻量级锁)的原理和升级的过程
关于锁的原理及升级过程的详细信息:synchronized的锁升级过程
三、重量级锁
当线程没有获得轻量级锁时,线程会CAS自旋来获取锁,当一个线程自旋10次之后,仍然未获得锁,那么就会升级成为重量级锁。
重量级锁会阻塞线程,线程不再竞争锁,而是由CPU进行调度,线程串行执行。
1. 重量级锁的原理和升级的过程
关于锁的原理及升级过程的详细信息:synchronized的锁升级过程