锁重入时Mark Word不修改,仅在栈帧新增displaced mark word为null的Lock Record;所有重入记录共享owner,Mark Word始终指向首次加锁的记录。

Java 中 synchronized 锁重入时,Mark Word 本身不存储 Displaced Mark Word,Displaced Mark Word 是线程在栈帧中自己创建的锁记录(Lock Record)里保存的一份拷贝,而 Mark Word 在重入时根本不会被修改或替换。
锁重入时 Mark Word 和栈帧锁记录的关系
- 当一个线程已经持有某个对象的轻量级锁(即 Mark Word 中 lock record 指针指向该线程栈帧中的某条 Lock Record),再次进入同一把锁的同步块,就发生锁重入。
- JVM 不会重复执行 CAS 替换 Mark Word 的操作,也不会新建 Lock Record 或更新 Displaced Mark Word。
- 它只是简单地在当前线程栈帧中新增一条 Lock Record,但这条新记录的
displaced mark word字段会被设为null(或特殊标记,如 0x0),表示这是一个重入记录,而非首次加锁。 - 同时,该新 Lock Record 的
owner指针仍指向原锁对象,而 Mark Word 保持不变——依然指向第一次加锁时创建的那条 Lock Record。
轻量级锁重入的关键行为
- 栈帧中 Lock Record 是链式结构:每次重入都会压入一条新记录,形成“锁记录栈”。
- 所有重入记录共享同一个 owner 对象,但只有最外层那条记录对应真实的锁状态。
- 解锁时按栈顺序逐条弹出,直到最后一条(即最初那条)才真正尝试用其
displaced mark word去 CAS 恢复 Mark Word。
实际代码表现示意(逻辑层面)
public synchronized void outer() {
inner(); // 重入:this 锁再次被同一线程获取
}
public synchronized void inner() {
// ...
}此时线程栈帧中可能有两条 Lock Record:
- 第一条(outer 进入时创建):
displaced mark word = 原始无锁状态值,owner = this - 第二条(inner 进入时创建):
displaced mark word = null,owner = this
Mark Word 始终只指向第一条记录地址,锁标志位仍是 00(轻量级锁),内容完全没变。
不复杂但容易忽略
立即学习“Java免费学习笔记(深入)”;


















