Java 锁升级的过程详解
Java 虚拟机(JVM)为了提高多线程并发的效率,对内置锁(synchronized
关键字)的实现进行了一系列优化。这些优化体现在锁的升级过程中,即当竞争程度从低到高变化时,锁的状态会从偏向锁逐渐升级为轻量级锁,最终升级为重量级锁。这个过程是不可逆的,一旦锁升级到更高级别,就不能降级。
1. 无锁状态 (Unlocked)
当一个对象刚刚被创建时,它的对象头中的Mark Word(标记字段)处于无锁状态。此时,任何线程都可以尝试获取该对象的锁。
2. 偏向锁 (Biased Locking)
偏向锁是JVM在没有实际竞争发生时,为了消除同步开销而引入的一种优化。它旨在减少只有一个线程反复获取同一把锁时的开销。
-
特点:
- 当一个线程第一次访问同步块并成功获取锁时,JVM会将对象的Mark Word设置为偏向模式,并将该线程的ID记录在Mark Word中。
- 之后,如果同一个线程再次访问这个同步块,它不需要再进行任何同步操作(如CAS操作),只需要简单地检查Mark Word中的线程ID是否是自己即可。
- 偏向锁的撤销(Revocation)发生在有其他线程尝试获取这个偏向锁时。
-
升