Mark Word 是 Java 对象头中动态复用的 64 位内存,其内容随锁状态(无锁 001、偏向锁 101、轻量级锁 000、重量级锁 010)实时切换,最后 3 位编码锁类型,其余位按需存储哈希码、线程 ID、GC 年龄或 monitor 指针,切换即覆盖,不可逆。

Java 对象头里的 Mark Word 是一块动态复用的 64 位(64 位 JVM)内存区域,它不固定存储某类数据,而是根据对象所处的锁状态,实时切换内容。锁状态不是靠额外字段标记,而是直接编码在 Mark Word 的最后 3 位中:最低 2 位是 lock bits(00、01、10),第 3 位是 biased_lock bit(0 或 1)。这三位组合决定当前锁类型,其余高位则按需存放不同信息。
无锁状态(001)
对象刚创建、未被加锁,也未调用过 System.identityHashCode() 时,Mark Word 高位通常为空或零,低位为 001。此时若已计算过哈希值,高位会存 25 位 hashcode,中间存 GC 年龄(4 位)等;只要没竞争,就一直保持这个结构。注意:一旦后续加锁,这些内容会被覆盖,不可恢复。
偏向锁状态(101)
启用偏向锁(默认开启)且首次被某个线程进入 synchronized 块时,JVM 尝试用 CAS 将当前线程 ID(54 位)、epoch(2 位)、GC 年龄(4 位)等写入 Mark Word,并把最后 3 位设为 101。此时对象“偏向”该线程,后续同一线程重入无需同步操作。但一旦有其他线程来竞争,就会触发偏向撤销——Mark Word 被恢复为无锁格式(001),原线程 ID 等信息彻底丢失。
轻量级锁状态(000)
偏向撤销后或未启用偏向锁时,线程会在自己的栈帧中创建一个 Lock Record,把对象原来的 Mark Word(称为 Displaced Mark Word)复制进去,再用 CAS 将对象头更新为指向该 Lock Record 的指针,同时把锁标志设为 000。此时多个线程通过自旋尝试获取锁,不阻塞、不挂起。如果自旋一定次数(如 10 次)仍失败,就准备升级。
中文敏感词/违禁词检测与内容合规性检查工具。支持对小红书(Xiaohongshu)、Douyin(抖音)、WeChat(微信)、Weibo(微博)、Bilibili(哔哩哔哩)、Zhihu(知乎)、Taobao(淘宝)、JD.com(京东)等主流平台的禁用词、限用词及高风险词进行文本扫描与合规性分析。
立即学习“Java免费学习笔记(深入)”;
重量级锁状态(010)
当轻量级锁竞争激烈、自旋失效,JVM 在堆中创建一个 ObjectMonitor 对象,把 Mark Word 更新为指向该 monitor 的指针,并将锁标志设为 010。此时线程不再自旋,而是进入 monitor 的 _entryList 阻塞等待。monitor 内部通过 _owner、_count、_recursions 等字段支持可重入和等待唤醒逻辑,真正依赖操作系统互斥原语。
锁状态切换本质是 Mark Word 内容的原子替换,全程由 JVM 在运行时按竞争行为动态驱动,不是定时或自动推进。理解它关键不在背字段长度,而在盯住那 3 位开关,以及明白“覆盖即切换”——同一块内存,不共存,只轮换。

















