如果在尝试加轻量级锁的过程中,CAS
操作无法成功,这时一种情况就是有其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。
- 当 Thread-1 进行轻量级加锁时,Thread-0 已经对该对象加了轻量级锁
- 这时 Thread-1 加轻量级锁失败,进入锁膨胀流程
- 即为 Object 对象申请
Monitor
锁,让Object
指向重量级锁地址 - 然后自己进入
Monitor
的EntryList
BLOCKED
- 即为 Object 对象申请
- 当
Thread-0
退出同步块解锁时,使用 cas 将Mark Word
的值恢复给对象头,失败。这时会进入重量级解锁流程,即按照Monitor
地址找到Monitor
对象,设置Owner
为null
,唤醒EntryList
中BLOCKED
线程