本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

1 作用

Lock Record用于偏向锁、轻量级锁优化。

  • 持有displaced word和锁住对象的元数据
  • 解释器使用lock record,检测非法的锁状态
  • 隐式充当锁重入机制的计数器

Lock Record用于轻量级锁优化,不同的是:

  • 存储为偏向锁状态的对象头(Mark Word为偏向锁)不包含指向Lock Record的指针
  • 轻量级锁状态包含指向Lock Record的指针

每个线程的线程私有栈里存储着一或多个Lock Record(支持可重入),如下图:

JVM 的Lock Record简介_元数据

2 数据结构

lock record保存对象mark word的原始值,还包含识别哪个对象被锁的所必需的元数据。

Lock Record的结构:

  • Displaced Mark Word
    该字段与轻量级锁关系更紧密,与偏向锁无关。存储的是锁对象的对象头中无锁状态的Mark Word , 以便释放锁时恢复Mark Word(例如保留了hash值等信息)
  • Object Reference
    该字段与偏向锁、轻量级锁、重量级锁都有关。存储的是锁对象的对象头的指针,即指向了锁对象的对象头。

在openjdk中通过两个类BasicObjectLock和BasicLock来实现

// A BasicObjectLock associates a specific Java object with a BasicLock.
// It is currently embedded in an interpreter frame.
class BasicObjectLock {
  friend class VMStructs;
 private:
  BasicLock _lock; // 锁, must be double word aligned
  oop       _obj; // 持有锁的对象
};


class BasicLock {
 private:
  volatile markOop _displaced_header; // 存储锁对象的 Mark Word 的拷贝
};

3 创建时机

当字节码解释器执行monitorenter字节码,轻量地锁住一个对象时,就会在获取锁的线程的栈上显式或隐式分配一个lock record。

4 创建位置

Interpreted frames contain a region which holds the lock records for all monitors owned by the activation. During interpreted method execution this region grows or shrinks depending upon the number of locks held.

解释帧包含一个区域,该区域保存激活拥有的所有监视器的锁记录。在解释的方法执行期间,该区域根据持有的锁数量增长或缩小。

所以lock record在线程的Interpretered Frame上分配。

参考: