轻量级锁与指向线程栈中锁记录的指针

dalang · · 22 次点击 · · 开始浏览    
--- ### **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` 仅作为锁的标识载体,两者在内存中独立存在。
22 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传