本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!
Lock Record用于偏向锁、轻量级锁优化。
Lock Record用于轻量级锁优化,不同的是:
每个线程的线程私有栈里存储着一或多个Lock Record(支持可重入),如下图:

lock record保存对象mark word的原始值,还包含识别哪个对象被锁的所必需的元数据。
Lock Record的结构:
该字段与轻量级锁关系更紧密,与偏向锁无关。存储的是锁对象的对象头中无锁状态的Mark Word , 以便释放锁时恢复Mark Word(例如保留了hash值等信息)
该字段与偏向锁、轻量级锁、重量级锁都有关。存储的是锁对象的对象头的指针,即指向了锁对象的对象头。
在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 的拷贝
};当字节码解释器执行monitorenter字节码,轻量地锁住一个对象时,就会在获取锁的线程的栈上显式或隐式分配一个lock record。
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上分配。
参考: