CodeWalk

synchronized锁升级过程详解

作者:古法程序员 · 2026-05-30 12:55

请详细说明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+默认禁用了偏向锁,因为维护成本高于收益。