本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!
- 🚀 魔都架构师 | 全网30W技术追随者
- 🔧 大厂分布式系统/数据中台实战专家
- 🏆 主导交易系统百万级流量调优 & 车联网平台架构
- 🧠 AIGC应用开发先行者 | 区块链落地实践者
- 🌍 以技术驱动创新,我们的征途是改变世界!
- 👉 实战干货:编程严选网
1 作用
Lock Record用于偏向锁、轻量级锁优化。
- 持有displaced word和锁住对象的元数据
- 解释器使用lock record,检测非法的锁状态
- 隐式充当锁重入机制的计数器
Lock Record用于轻量级锁优化,不同的是:
- 存储为偏向锁状态的对象头(Mark Word为偏向锁)不包含指向Lock Record的指针
- 轻量级锁状态包含指向Lock Record的指针
每个线程的线程私有栈里存储着一或多个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上分配。
参考:
- 《Eliminating Synchronization-Related Atomic Operations with Biased Locking and Bulk Rebiasing》
- https://wiki.openjdk.java.net/display/HotSpot/Synchronization
















