这个在 java | synchronized 优化 轻量级锁 的 E
过程有描述。
如果尝试加轻量级锁的过程中,CAS
操作无法成功,这时候,就是其他线程对此对象家了轻量级锁(有竞争),这个时候会进行锁膨胀,将轻量级锁变成重量级锁。
A
在尝试加轻量级锁的过程中,CAS
操作无法成功,可能是其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁
当 Thread-1
进行轻量级加锁时,Thread-0
已经对该对象加了轻量级锁
B
Thread-1
加轻量级锁失败,进入锁膨胀流程:为 Object
对象申请 Monitor
锁,通过 Object
对象头获取到持锁线程,将 Monitor
的 Owner
置为 Thread-0
,将 Object
的对象头指向重量级锁地址,然后自己进入 Monitor
的 EntryList BLOCKED
当 Thread-0
退出同步块解锁时,使用 CAS
将 Mark Word
的值恢复给对象头失败,这时进入重量级解锁流程,即按照 Monitor
地址找到 Monitor
对象,设置 Owner
为 null
,唤醒 EntryList
中 BLOCKED
线程
具体过程可以参考