锁升级是JVM在低开销与强一致性间动态权衡的性能优化策略:无竞争用偏向锁(JDK15已移除,现代常禁用),轻度竞争转轻量级锁(CAS自旋,非固定次数升级),激烈竞争才膨胀为重量级锁(OS级线程挂起);升级单向不可降级。

锁升级的本质是 JVM 的性能优化策略
不要只背“偏向锁→轻量级锁→重量级锁”这个流程。高分回答要讲清:为什么需要升级?升级的触发条件是什么?每个阶段解决什么问题?JVM 不是机械地按顺序升级,而是根据竞争情况动态决策——没有竞争时用偏向锁减少同步开销;出现少量线程交替执行,升级为轻量级锁(基于 CAS 和对象头 Mark Word 自旋);当自旋失败、竞争激烈或等待线程多,才膨胀为重量级锁(挂起线程、进入操作系统 Mutex)。
关键细节决定专业度
考官想听你是否真正理解底层机制,不是复述概念:
- 偏向锁默认开启但常被禁用:JDK 6 引入,适用于单线程长期持有锁的场景;但 CMS GC 会触发全局安全点导致批量撤销,反而影响性能;JDK 15 起已移除,回答时需说明“现代 JDK(如 8/11/17)中偏向锁常被 -XX:-UseBiasedLocking 关闭”
- 轻量级锁不是“锁”,是乐观尝试:它不阻塞线程,靠 CAS 替换 Mark Word 中的锁记录指针;自旋次数由 -XX:PreBlockSpin(旧)或自适应策略(新)控制;自旋失败才升级,不是固定次数后强制升级
- 重量级锁 ≠ synchronized 本身失效:它把线程状态交给 OS 管理,涉及用户态/内核态切换、线程挂起/唤醒,开销大;但此时锁依然可重入、可中断(wait/notify)、支持锁粗化/消除等 JIT 优化
结合代码与现象,体现实战理解
光说理论不够,用简单例子佐证:
比如两个线程交替执行 synchronized 方法,无明显竞争 → JVM 可能维持轻量级锁(自旋成功);若一个线程长时间持有锁,另一个频繁尝试获取 → 自旋失败增多 → 升级为重量级锁;再比如启动参数加 -XX:+PrintSynchronizationStatistics,可观察锁状态分布(需配合 -XX:+UnlockDiagnosticVMOptions)。
还要提一句:锁降级不存在——升级是单向的,一旦膨胀为重量级锁,整个生命周期都保持该状态,这是为了规避反复升降带来的复杂性和开销。
最后补一句认知升维
锁升级机制本质是 JVM 在“低开销”和“强一致性”之间做的权衡。现在更推荐用 java.util.concurrent 中的显式锁(如 ReentrantLock)或无锁工具(CAS、StampedLock、VarHandle),因为它们可控性更强;而 synchronized 更适合简单、确定的同步场景——理解升级机制,是为了写出更合理的同步逻辑,而不是为了手动干预它。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











