0%

java | synchronized 优化 锁膨胀

这个在 java | synchronized 优化 轻量级锁E 过程有描述。

如果尝试加轻量级锁的过程中,CAS 操作无法成功,这时候,就是其他线程对此对象家了轻量级锁(有竞争),这个时候会进行锁膨胀,将轻量级锁变成重量级锁。

A

在尝试加轻量级锁的过程中,CAS 操作无法成功,可能是其它线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁

Thread-1 进行轻量级加锁时,Thread-0 已经对该对象加了轻量级锁

B

Thread-1 加轻量级锁失败,进入锁膨胀流程:为 Object 对象申请 Monitor 锁,通过 Object 对象头获取到持锁线程,将 MonitorOwner 置为 Thread-0,将 Object的对象头指向重量级锁地址,然后自己进入 MonitorEntryList BLOCKED

Thread-0 退出同步块解锁时,使用 CASMark Word 的值恢复给对象头失败,这时进入重量级解锁流程,即按照 Monitor 地址找到 Monitor 对象,设置 Ownernull,唤醒 EntryListBLOCKED 线程

具体过程可以参考

请我喝杯咖啡吧~