轻量级锁通过lock record及其中的displaced mark word实现无系统调用的高效同步:前者在线程栈中构建私有上下文,后者保存对象头原始快照以支撑cas加锁与原子解锁;拷贝与cas配套完成乐观并发控制,失败则升级重量级锁。

轻量级锁的核心在于避免重量级锁的系统调用开销,而 Lock Record 及其携带的 Displaced Mark Word,正是实现这一目标的关键基础设施。它不依赖堆内存或内核资源,完全在线程栈上运作,既轻量又高效。
Displaced Mark Word 是解锁时恢复对象头的“原始快照”
当线程尝试加锁时,对象处于无锁状态(Mark Word 低3位为 01),内容可能是哈希码、分代年龄等。JVM 先将此时的完整 Mark Word 拷贝进当前线程栈帧中的 Lock Record,存为 Displaced Mark Word。这个值不是临时标记,而是唯一可信的“解锁依据”——后续解锁必须把该值原样写回对象头,才能确认轻量级锁路径依然有效。
- 若写回成功,说明期间没有其他线程介入竞争,锁可干净释放
- 若写回失败(CAS 不匹配),说明对象头已被改写为指向 ObjectMonitor 的指针(即已升级为重量级锁),此时需交由 monitor 机制完成解锁
Lock Record 本身是线程私有的上下文锚点
Lock Record 并非单纯的数据容器,它在栈中构建了一个与当前锁操作强绑定的执行上下文:
- owner 字段明确指向被锁定的对象,用于快速识别锁归属
- Displaced Mark Word 字段保存原始状态,支撑原子性恢复
- 多个重入时,会连续分配多个 Lock Record,每个都带 null 的 Displaced Mark Word,形成隐式计数链
- 方法退出时,整个栈帧自动销毁,Lock Record 随之消失,无需 GC 或显式清理
拷贝行为确保了 CAS 替换的安全前提
CAS 操作能否成功,取决于对象头是否仍处于“期望的无锁值”。Displaced Mark Word 的拷贝发生在 CAS 之前,本质是一次原子性读取 —— 它为后续的 CAS 提供了旧值基准。只有当对象头未被其他线程修改过,CAS 才能将 Mark Word 替换为指向该 Lock Record 的指针(低2位设为 00,标识轻量级锁)。
- 拷贝和 CAS 是配套动作:先读出“此刻无锁”,再尝试“写入我已锁定”
- 若拷贝后立刻有别的线程抢先完成 CAS,本线程的 CAS 就会失败,自然进入自旋或升级逻辑
- 这使得轻量级锁天然具备乐观并发控制(OCC)特征:假设无竞争,失败再处理
不参与锁竞争,但决定锁是否还能“轻下去”
Displaced Mark Word 本身不参与任何竞争判断,但它决定了整个轻量级锁路径是否可持续:
- 解锁时 CAS 恢复失败 → 触发重量级锁流程
- 锁重入时 Displaced Mark Word 设为 null → 区分首次加锁与重入,避免重复恢复
- 一旦锁膨胀为重量级,所有后续操作绕过 Lock Record,直接走 ObjectMonitor → 轻量级路径彻底失效











