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

Lock Record的数据结构

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

在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;
};
lock record的创建时机

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

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上(解释帧)分配。

作用

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

参考

  • 《Eliminating Synchronization-Related Atomic Operations with Biased Locking and Bulk Rebiasing》
    https://wiki.openjdk.java.net/display/HotSpot/Synchronization