java锁升级通过mark word低3位编码标识状态,复用其余位存储线程id、指针等,实现无锁化设计;典型路径为001(无锁)→101(偏向锁)→000(轻量级锁)→010(重量级锁),全程依赖cas原子更新。

Java 锁升级过程中,对象的 Mark Word 通过复用其 64 位(64-bit JVM)中的部分比特位,以不同编码组合表示当前锁的状态。它不额外存储锁对象,而是将锁信息“内嵌”在对象头中,实现轻量级、无锁化的设计目标。
Mark Word 的结构与锁状态映射关系
在 64 位 HotSpot JVM 中(开启指针压缩,默认情况),对象头包含两部分:Mark Word(8 字节)和 Klass Word(4 字节)。其中 Mark Word 的低 3 位(bit 0–2)是关键,用于标识锁状态;其余位根据状态不同,复用为线程 ID、epoch、hash code 或指向 Monitor 的指针等。
常见锁状态及 Mark Word 编码如下(以 64 位为例,实际布局受是否启用指针压缩影响):
-
无锁状态(Normal):最低 3 位为
001;剩余 57 位可能存对象哈希码(未计算时为 0)、分代年龄、偏向锁标识位(若开启偏向锁)等 -
偏向锁(Biased):最低 3 位为
101;紧接着的 54 位(或 53 位)存储持有该锁的线程 ID;还有 2 位存 epoch(用于批量撤销) -
轻量级锁(Lightweight):最低 3 位为
000;剩余 61 位存储指向当前线程栈中Lock Record的指针(即 Displaced Mark Word 所在位置) -
重量级锁(Heavyweight):最低 3 位为
010;剩余 61 位存储指向堆中ObjectMonitor对象的指针 -
GC 标记状态(如 CMS/标记):最低 3 位为
111,具体含义由 GC 算法定义,此时不参与锁逻辑
锁升级时 Mark Word 如何变化
锁升级本质是 Mark Word 值的原子更新过程,依赖 CAS 操作完成状态迁移。每次升级都需先读取当前 Mark Word,校验状态合法,再写入新编码。典型路径为:无锁 → 偏向锁 → 轻量级锁 → 重量级锁(不可逆)。
- 偏向锁获取:线程第一次进入同步块,CAS 将 Mark Word 从
001改为101并填入自身 thread ID;失败则触发偏向撤销(revoke) - 偏向撤销:检测到竞争(如其他线程尝试获取),JVM 将偏向锁升级为轻量级锁 —— 先将原 Mark Word(含 thread ID)保存到当前线程栈的 Lock Record 中,再 CAS 更新 Mark Word 为
000+ 指向该 Lock Record 的指针 - 轻量级锁膨胀:当自旋失败(如多核竞争激烈、自旋耗时超阈值),JVM 在堆中创建
ObjectMonitor,将 Mark Word 改为010+ 指向该 Monitor 的指针,并把所有 Lock Record 中的 Displaced Mark Word 拷贝进 Monitor 的 owner 字段等
注意几个关键细节
Mark Word 的解释不是静态的,而是**上下文敏感**的:同一组比特,在不同锁状态下含义完全不同。JVM 通过检查最低 3 位快速分支,决定如何解读其余位。
- 偏向锁默认开启(Java 6u23+),但启动后几秒内会禁用(避免启动阶段大量对象被偏向),可通过
-XX:+UseBiasedLocking和-XX:BiasedLockingStartupDelay=0控制 - 轻量级锁的 Lock Record 是线程私有栈帧里的一个结构,包含 Displaced Mark Word 和指针字段,不属于堆对象
- 重量级锁下,Mark Word 不再记录持有线程,而是交由
ObjectMonitor统一管理 wait set、entry list、owner 等,支持 wait/notify 和公平性 - 所有变更都要求 CAS 成功,否则重试或升级;因此 Mark Word 的更新必须是原子的,这也是为什么它被设计为单个机器字(word)大小
如何验证 Mark Word 变化
可借助 JOL(Java Object Layout) 工具配合调试代码观察。例如:
- 新建对象后调用
System.identityHashCode(),再用 JOL 查看,Mark Word 中通常含 hash code(001状态) - 在 synchronized 块中打印 JOL,对比进入前后 Mark Word 十六进制值变化(需禁用偏向延迟或等待偏向启用)
- 使用
-XX:+PrintAssembly(需 hsdis)可看到 lock 相关指令对 Mark Word 的 CAS 操作,但较复杂
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











