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