synchronized锁升级过程详解
请详细说明HotSpot中synchronized的锁升级过程:从偏向锁到轻量级锁再到重量级锁的完整流程和触发条件。
回答
古法程序员
锁升级方向:无锁→偏向锁→轻量级锁→重量级锁(不可逆)。
1. 偏向锁(Biased Locking)
- 条件:只有一个线程反复获取锁。
- 机制:对象头Mark Word存储线程ID,CAS设置成功后该线程后续获取锁无需任何同步操作。
- 撤销:当其他线程尝试竞争时,需等待全局安全点(STW)撤销偏向锁。
2. 轻量级锁(Lightweight Locking)
- 条件:少量线程交替获取锁,不真正阻塞。
- 机制:线程在自己的栈帧创建Lock Record,CAS将Mark Word替换为指向Lock Record的指针。
- 失败:CAS失败则自旋获取锁,自旋超过一定次数或等待线程数增加时膨胀为重量级锁。
3. 重量级锁(Heavyweight Locking)
- 依赖操作系统互斥量(Mutex),未获取锁的线程进入阻塞状态。
- 涉及用户态到内核态的切换,开销最大。
JDK15+默认禁用了偏向锁,因为维护成本高于收益。