偏向锁获取:当Thread_1尝试获取锁时,首先会尝试获取偏向锁。如果获取偏向锁成功,则将锁的状态设为偏向锁状态。偏向锁升级为轻量级锁:当另一个线程到达并尝试获取同一个锁时,会检查偏向锁的线程ID是否匹配。如果线程ID不匹配,会进一步检查持有偏向锁的Thread_1是否仍然存活。如果Thread_1仍然存活,则...
锁synchronized升级过程java
Java中的锁升级过程如下:
偏向锁获取:
当Thread_1尝试获取锁时,首先会尝试获取偏向锁。如果获取偏向锁成功,则将锁的状态设为偏向锁状态。偏向锁升级为轻量级锁:
当另一个线程到达并尝试获取同一个锁时,会检查偏向锁的线程ID是否匹配。如果线程ID不匹配,会进一步检查持有偏向锁的Thread_1是否仍然存活。如果Thread_1仍然存活,则偏向锁会升级为轻量级锁。在升级过程中,会在Thread_2的栈帧中创建一个displaced Mark Word,将原来的mark word复制到Thread_2的栈帧中,并设置相关标志位为轻量级锁状态。轻量级锁竞争:
如果Thread_2尝试获取锁时,发现锁已经是轻量级锁状态,并且竞争存在,则会进入自旋等待状态。自旋次数有一个默认阈值。如果Thread_2在自旋过程中成功获取到锁,则继续执行。轻量级锁升级为重量级锁:
如果Thread_2在达到自旋次数阈值后仍未获取到锁,为了避免CPU空转,轻量级锁会升级为重量级锁。在升级为重量级锁的过程中,会创建一个ObjectMonitor对象,并在对象的mark word中记录相关的指针信息。重量级锁涉及的ObjectMonitor结构包括两个队列和一个指针,分别用于管理锁池中的线程、等待池中的线程以及当前锁持有者。注意:锁升级过程是不可逆的,即锁一旦从偏向锁或轻量级锁升级为重量级锁,就不会再降级为偏向锁或轻量级锁。
2025-03-14