synchronized锁升级由JVM根据Mark Word状态和线程行为逐层触发:无锁(01)→偏向锁(01+偏向位1)→轻量级锁(00)→重量级锁(10),全程依赖锁标志位、偏向位、CAS结果及自旋阈值等硬性判断点。

synchronized 锁升级不是自动“猜”出来的,而是由 JVM 在运行时根据对象头(Mark Word)的精确状态和线程行为,逐层检查、触发转换。整个流程中真正起决策作用的,是几个硬性、可验证的关键判断点。
对象头 Mark Word 的锁标志位与状态位
这是所有判断的物理基础。JVM 每次加锁前都读取对象头中的 Mark Word,重点看两个字段:
- 锁标志位(2 bit):01 表示无锁或偏向锁(需结合偏向位判断),00 表示轻量级锁,10 表示重量级锁
- 偏向锁标识位(1 bit):在锁标志位为 01 时有效,为 1 表示当前处于偏向锁状态,为 0 则跳过偏向逻辑,直接走轻量级锁路径
例如:线程首次进入同步块,发现 Mark Word 是 01 + 偏向位=1,且线程 ID 匹配,则直接走偏向锁重入;若偏向位=0,哪怕标志位是 01,也会立刻尝试 CAS 获取轻量级锁。
是否为当前线程持有偏向锁
当检测到对象处于偏向锁状态(即标志位 01 且偏向位=1)时,并不直接升级,而是做一次原子校验:
立即学习“Java免费学习笔记(深入)”;
- 检查 Mark Word 中记录的线程 ID 是否等于当前线程 ID
- 若相等 → 允许无成本重入,不修改 Mark Word,仅在当前线程栈中新增 Lock Record(记录重入次数)
- 若不等 → 触发偏向锁撤销(revoke),必须等待全局安全点(safepoint),然后清空线程 ID、置偏向位为 0,为升级轻量级锁做准备
这个判断决定了“是否还能继续省事”,是偏向锁能否持续生效的唯一开关。
CAS 尝试获取轻量级锁是否成功
进入轻量级锁逻辑后,核心动作是线程在自己栈帧中新建 Lock Record,并用 CAS 把 Mark Word 替换为指向该记录的指针。关键判断点就是:
- CAS 返回 true → 成功获取锁,Mark Word 更新为指针,锁标志位设为 00
- CAS 返回 false → 说明已有其他线程正在操作该 Mark Word(竞争发生),此时立即进入自旋逻辑
注意:CAS 失败本身不直接升级,只是启动自旋;是否升级取决于后续自旋结果。
自旋是否超限或竞争线程数是否超标
轻量级锁下的自旋不是无限进行的,JVM 依据两个硬性条件决定是否膨胀为重量级锁:
- 自旋次数达到阈值:默认 10 次(JDK 1.7+ 支持适应性自旋,会参考历史成功概率动态调整,但仍有上限)
- 竞争线程数量超过阈值:比如同一时刻有 ≥3 个线程在自旋争抢(具体策略因 JVM 实现略有差异,但本质是识别“高并发竞争”)
任一条件满足,JVM 就将对象头 Mark Word 更新为指向 Monitor 的指针,锁标志位置为 10,所有未获锁线程转入阻塞队列——重量级锁正式启用。


















