Java锁升级是HotSpot虚拟机为平衡安全与性能的动态优化策略,路径为无锁→偏向锁→轻量级锁→重量级锁,由运行时竞争驱动、不可逆(除撤销外),核心依赖Mark Word状态变更。

Java 中锁升级路线图不是官方标准图,而是 HotSpot 虚拟机对 synchronized 锁在运行时的优化策略总结。向面试官清晰展示,关键不在画得多精美,而在讲清“为什么升”“怎么升”“升了什么”“何时降”,并结合对象头结构和实际场景。
锁升级的四个阶段(核心逻辑链)
锁升级本质是 JVM 为平衡“安全”与“性能”做的动态决策,路径唯一且不可逆(除锁消除/偏向撤销外):
- 无锁状态:对象刚创建,Mark Word 存对象哈希码、GC 分代年龄等,未被任何线程竞争
- 偏向锁:仅一个线程反复进入同步块 → JVM 在 Mark Word 记录该线程 ID,后续进入无需 CAS,零同步开销
- 轻量级锁:有第二个线程尝试竞争 → 偏向锁撤销,升级为轻量锁;线程在栈帧中创建 Lock Record,用 CAS 尝试将 Mark Word 指向它
- 重量级锁:多线程频繁竞争或自旋失败 → 轻量锁膨胀为重量级锁,Mark Word 指向 Monitor 对象,线程挂起进等待队列
如何在白板/纸上画出清晰路线图(面试实操建议)
用三列布局(简洁易记),配合箭头+简注,避免堆砌术语:
- 左列:锁状态(无锁 → 偏向锁 → 轻量级锁 → 重量级锁)竖排写,加粗关键词
- 中列:触发条件(如“首次进入同步块”“出现第二个竞争线程”“自旋一定次数失败”)对应写在箭头旁
- 右列:底层变化(如“Mark Word 置偏向线程 ID”“CAS 替换为指向栈中 Lock Record”“Mark Word 指向堆中 ObjectMonitor”)点出关键动作
- 在“偏向锁 → 轻量级锁”处标注:偏向撤销需 STW(Stop-The-World)暂停,但时间极短
必须强调的三个认知误区(体现深度)
面试官常借此考察理解是否流于表面:
- 锁升级不是自动定时发生:完全由运行时竞争模式驱动,无固定时间或次数阈值(JDK 15+ 默认关闭偏向锁,但原理仍需掌握)
- “升级”不等于“变重”就一定慢:轻量锁自旋消耗 CPU,但若竞争短暂,远快于挂起线程的重量级锁;要讲清 trade-off
- 对象头结构是理解基础:Mark Word 在 64 位 JVM 中占 8 字节,不同状态复用同一字段(如低 2 位存锁标志位:01=偏向/轻量,10=重量,11=GC 标志),画个简化的 Mark Word 表格能瞬间加分
一句话收尾,直击本质
锁升级是 JVM 针对 synchronized 的渐进式优化机制,目标是让无竞争场景几乎零成本,有竞争时用最小代价过渡到可靠同步——它不是设计出来的“路线”,而是虚拟机在运行时根据真实竞争热度做出的适应性选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











