LockRecord是轻量级锁的核心结构,线程在栈帧中创建,包含Owner指针、Displaced Mark Word等字段,通过CAS实现无锁自旋抢锁;它纯用户态、线程私有,与重量级锁的Monitor有本质区别。
lockrecord 是 jvm 在 synchronized 锁升级为轻量级锁时,为每个竞争线程在**自己的 java 虚拟机栈帧中分配的一段结构化内存空间**,它的核心作用是:让线程能以无锁、不依赖操作系统的方式,安全地参与轻量级锁的获取与释放过程。
LockRecord 存什么?
它不是简单标记,而是一个有明确字段的记录结构,关键字段包括:
- Owner 指针:指向被锁定的对象(即 synchronized 的监视器对象)
- Displaced Mark Word(原Mark Word备份):保存该对象在加锁前对象头 Mark Word 的原始值(比如哈希码+年龄+01)
- Object reference 字段:有时也用于反向指向该 LockRecord 所属的锁对象,辅助解锁判断
LockRecord 怎么用?
它全程配合 CAS 操作,支撑轻量级锁的“自旋尝试”逻辑:
- 线程进入 synchronized 块时,先在自己栈帧里新建一个 LockRecord
- 用 CAS 尝试把对象头的 Mark Word 替换为指向这个 LockRecord 的指针(同时把原 Mark Word 备份进 LockRecord)
- CAS 成功 → 当前线程获得轻量级锁,直接执行临界区
- CAS 失败 → 说明其他线程已抢先设置,当前线程开始自旋重试或触发锁膨胀
为什么必须放在线程栈里?
这是轻量级锁“轻”的关键设计:
- 栈内存由线程私有,无需同步,读写极快
- 线程退出同步块时,直接通过栈帧定位到自己的 LockRecord,用 CAS 把备份的 Mark Word 写回对象头即可解锁
- 若发生锁重入,JVM 会在同一线程栈中再压入一条 LockRecord,形成链式计数,避免重复 CAS
它和重量级锁里的 Monitor 有什么区别?
LockRecord 是纯用户态、线程栈内、瞬时存在的轻量结构;而 Monitor 是堆中全局的、由操作系统 Mutex 支撑的重量级结构。一旦锁膨胀为重量级,LockRecord 就失效,对象头 Mark Word 改为指向 Monitor 对象,后续所有操作都转交操作系统调度。
立即学习“Java免费学习笔记(深入)”;


















