在Java中,特别是ReentrantLock
和synchronized
关键字的实现中,锁的升级通常涉及到从无锁状态到偏向锁、再升级到轻量级锁,最后可能升级到重量级锁的过程。这一系列过程是为了减少锁带来的开销,提高并发效率。
-
偏向锁(Biased Locking):大多数情况下,锁会偏向于第一个获得它的线程,之后此线程再次请求锁时,无需进行同步操作,直接访问。这是一种优化措施,假定锁将由同一线程多次获取。
-
轻量级锁(Lightweight Locking):当有第二个线程尝试获取已被偏向的锁时,偏向锁会升级为轻量级锁。轻量级锁通过CAS操作(Compare and Swap)试图将锁标志位设置为“锁定状态”,避免重量级锁带来的操作系统层面的开销。
-
重量级锁(Heavyweight Locking):如果轻量级锁下的多个线程争用同一个锁导致CAS失败(即自旋操作达到一定次数后),锁会进一步升级为重量级锁,这时会涉及到操作系统层面的互斥锁(mutex),线程会被阻塞和唤醒,开销较大。