轻量级锁通过线程栈帧中的Lock Record(含Displaced Mark Word副本和owner指针)与CAS操作实现,加锁时CAS替换Mark Word为Lock Record地址,失败则自旋;重入时新增owner相同、Displaced Mark Word为null的记录;解锁时CAS回写原始Mark Word,失败则升级为重量级锁。

Java 中轻量级锁不依赖操作系统,而是靠线程栈帧里的锁记录(Lock Record)配合 CAS 操作实现同步,核心是避免挂起线程、减少开销。
锁记录存什么内容
每个线程在尝试获取轻量级锁时,会在自己的栈帧中创建一个 Lock Record,里面主要存两样东西:
- Displaced Mark Word:对象头原始的 Mark Word 副本,用于后续解锁时还原对象状态
- Owner 指针:指向当前持有锁的线程(首次加锁时填入;重入时新建记录,Owner 相同,Displaced Mark Word 设为 null)
加锁过程靠 CAS 绑定锁记录
当线程执行 synchronized(obj) 且 obj 处于无锁态(Mark Word 锁标志位为 01,偏向锁关闭)时:
- 在线程栈中分配 Lock Record,拷贝 obj 当前 Mark Word 到 Displaced Mark Word 字段
- 用 CAS 尝试把 obj 的 Mark Word 替换为指向该 Lock Record 的地址
- CAS 成功 → Mark Word 锁标志位变为 00,表示已进入轻量级锁定状态,锁绑定完成
- CAS 失败 → 说明其他线程已抢先加锁,当前线程开始自旋等待(默认最多 10 次)
重入时新增空记录,不改原 Mark Word
同一线程再次进入同一把锁的同步块(比如递归或嵌套 synchronized):
立即学习“Java免费学习笔记(深入)”;
- CAS 会失败,因为 Mark Word 已是指向本线程 Lock Record 的指针
- JVM 检查该 Lock Record 的 Owner 是否为自己,确认是重入
- 在线程栈中再建一个 Lock Record,Owner 仍指向自己,Displaced Mark Word 设为 null —— 这个 null 记录充当重入计数器
- 每次退出同步块,就清理最顶层的一个 Lock Record;全部清完才真正释放锁
解锁靠原子回写,失败即升级
退出同步块时,JVM 尝试将 Lock Record 中保存的 Displaced Mark Word 写回对象头:
- CAS 回写成功 → 对象恢复无锁状态(或保持轻量级锁供下次使用),同步完成
- CAS 回写失败 → 说明期间有其他线程竞争过,锁已被膨胀为重量级锁,此时需走 Monitor 解锁逻辑,唤醒阻塞队列中的线程


















