Java中的线程锁机制包括偏向锁(Biased Locking)、轻量级锁(Lightweight Locking)和重量级锁(Heavyweight Locking)。这些锁机制是为了在多线程并发访问时保证数据的一致性和防止竞态条件而设计的。
偏向锁(Biased Locking):
偏向锁是为了在无竞争的情况下提高性能而设计的。当只有一个线程访问临界区,会将锁对象记录在当前线程的栈帧的锁记录中,并标记为偏向锁。
当另一个线程尝试获取偏向锁时,会检查原来的偏向锁是否已经被其他线程获取,如果没有,升级为轻量级锁;如果有,撤销偏向锁并尝试使用CAS(Compare And Swap)操作进行轻量级锁的升级。
轻量级锁(Lightweight Locking):
当出现多个线程争用同一把锁时,会升级为轻量级锁。轻量级锁使用CAS操作来对锁定标志位进行操作,尝试用自旋来获取锁。
如果自旋失败,说明存在竞争,锁会膨胀为重量级锁。
重量级锁(Heavyweight Locking):
当多个线程长时间竞争同一把锁,锁会膨胀为重量级锁。重量级锁会使其他线程阻塞挂起,并进入内核态调度。
锁的升级过程:
默认情况下,对象刚创建时是无锁的状态。
当某个线程第一次访问同步块时,会升级为偏向锁,如果没有竞争发生,此线程再次进入同步块时不需要再进行同步操作,可直接访问。
当有多个线程访问同步块时,偏向锁升级为轻量级锁,采用CAS操作进行锁的操作。
若仍有线程竞争,轻量级锁将会升级为重量级锁,此时会阻塞其他竞争锁的线程。
本文作者:whitebear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!