synchronized 的锁状态管理完全依赖对象头中的 mark word,它在 64 位 jvm 中占 8 字节,通过复用存储空间实现无锁→偏向锁→轻量级锁→重量级锁的单向升级,所有状态切换均由 cas 原子更新 mark word 完成。

synchronized 的锁状态管理完全依赖对象头中的 Mark Word,这是 JVM 实现锁机制的物理基础。
对象头是锁状态的存储容器
每个 Java 对象在堆内存中都包含对象头,它由两部分组成:Mark Word 和 Klass Pointer。其中 Mark Word 是锁状态的核心载体,长度在 64 位 JVM 中为 8 字节,会根据锁所处阶段动态复用存储空间。
- 无锁状态时,Mark Word 存储哈希码、GC 分代年龄和 3 位锁标志(值为 01)
- 偏向锁启用后,同一位置改存偏向线程 ID、Epoch 和偏向标志(锁标志仍为 01,但含义不同)
- 轻量级锁竞争时,Mark Word 被替换为指向当前线程栈中 Lock Record 的指针(锁标志变为 00)
- 升级为重量级锁后,Mark Word 存储指向操作系统 Monitor 对象的指针(锁标志为 10)
锁升级靠 Mark Word 的状态切换驱动
锁升级不是独立操作,而是 Mark Word 内容被原子更新的过程。JVM 通过 CAS 操作尝试修改 Mark Word,成功则完成状态跃迁,失败则触发下一级锁逻辑。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 偏向锁撤销时,JVM 会将 Mark Word 恢复为无锁状态(含哈希码),再尝试升级为轻量级锁
- 轻量级锁加锁失败(如发现 Mark Word 已指向其他线程的栈帧),说明存在竞争,直接膨胀为重量级锁
- 所有升级路径单向进行:无锁 → 偏向锁 → 轻量级锁 → 重量级锁,不可逆
任意对象能当锁,是因为每个对象都有 Mark Word
Java 规定所有对象实例都具备对象头结构,因此任何对象都能承载锁状态信息。synchronized(obj) 的本质,就是对 obj 对象头中 Mark Word 的读写与状态校验。
- 实例方法同步等价于 synchronized(this),锁的是当前对象的 Mark Word
- 静态方法同步等价于 synchronized(YourClass.class),锁的是 Class 对象的 Mark Word
- Monitor 关联动作,实际就是把 Mark Word 更新为指向对应 ObjectMonitor 的指针
Mark Word 结构紧凑,支撑高效状态判断
Mark Word 设计为“一域多用”,用固定位宽承载不同语义信息。JVM 仅需检查锁标志位(通常是低 2–3 位),就能快速识别当前锁类型,无需额外字段或对象引用。
- 标志位组合明确:01 表示无锁或偏向锁,00 表示轻量级锁,10 表示重量级锁
- 这种位级编码让锁状态判断变成一次内存读取 + 位运算,开销极小
- 也正因如此,synchronized 在无竞争场景下几乎不产生调度或系统调用开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










