---
### **1. 锁记录(Lock Record)的本质**
• **定义**:
锁记录是线程私有的内存结构,由 JVM 在 **线程栈帧** 中动态创建。当线程尝试通过轻量级锁进入同步代码块时,JVM 会在该线程的栈帧中分配一个 `Lock Record` 空间。
• **存储内容**:
• **Displaced Mark Word**:保存对象头中原始的 Mark Word 数据(如哈希码、分代年龄等),用于解锁时恢复对象头状态。
• **Owner 指针**:指向当前持有锁的对象(即 `synchronized(a)` 中的对象 `a`)。
---
### **2. Mark Word 指针的作用**
• **轻量级锁状态下的结构**:
对象头中的 Mark Word 会被修改为以下形式:
| **标志位(2 bits)** | **指向锁记录的指针(62 bits)** |
|---------------------|--------------------------------|
| 00(轻量级锁标志) | 当前线程栈中 Lock Record 的地址 |
这一指针用于标识当前线程已通过 CAS 操作成功获取锁。
• **与对象 `a` 的关系**:
• **对象 `a` 的指针**:`synchronized(a)` 中的对象 `a` 是锁的载体,其内存地址由程序直接管理。
• **锁记录指针**:仅用于轻量级锁机制中,记录当前线程获取锁的状态和对象 `a` 的原始信息,**与对象 `a` 本身的内存地址无关**。
---
### **3. 轻量级锁的核心流程**
1. **锁记录创建**:
线程进入同步块时,JVM 在其栈帧中创建 `Lock Record`,并将对象 `a` 的原始 Mark Word 拷贝到 `Displaced Mark Word` 字段。
2. **CAS 竞争锁**:
JVM 尝试通过 CAS 操作将对象 `a` 的 Mark Word 更新为 **指向当前线程栈中 Lock Record 的指针**,并将锁标志位设为 `00`。
3. **竞争结果处理**:
• **成功**:线程持有锁,继续执行同步代码。
• **失败**:锁膨胀为重量级锁,Mark Word 指向操作系统级监视器(Monitor)。
---
### **4. 与对象 `a` 的关联**
• **Owner 指针的指向**:
锁记录中的 `Owner` 字段会指向对象 `a`,表明当前线程持有该对象的锁。
• **解锁时的操作**:
释放锁时,JVM 需将 `Displaced Mark Word` 写回对象 `a` 的 Mark Word,并清除锁记录的指针。
---
### **总结**
| **概念** | **说明** |
|----------------------|-------------------------------------------------------------------------|
| **锁记录指针** | 对象头中指向线程栈帧中 Lock Record 的地址,用于标识锁的持有状态(轻量级锁)。 |
| **对象 `a` 的指针** | 内存中对象 `a` 的实际地址,与锁记录指针无直接关联。 |
| **核心目的** | 通过 CAS 和线程私有锁记录,减少重量级锁的竞争开销。 |
轻量级锁通过 **锁记录指针** 实现无竞争场景下的高效同步,而 `synchronized(a)` 中的对象 `a` 仅作为锁的标识载体,两者在内存中独立存在。