CAS竞争成功指首个线程在无锁态下原子地将自身Lock Record地址写入对象头,使Mark Word低3位由01变为00,进入轻量级锁定状态,全程无操作系统介入。

Java 中轻量级锁在 CAS 竞争成功后,会从“无锁”状态(即对象头 Mark Word 指向偏向锁或无锁标记)转变为“轻量级锁定”状态,核心是将当前线程的栈帧中锁记录(Lock Record)的地址通过 CAS 原子操作写入对象头的 Mark Word。
轻量级锁加锁时的 CAS 成功意味着什么
CAS 竞争成功不是指多个线程抢同一个锁成功,而是指当前线程首次尝试获取锁时,对象处于无锁状态(Mark Word 未被任何线程锁定),且该线程成功用 CAS 将自己的锁记录地址替换进对象头。
- 此时对象头 Mark Word 的低 3 位从
01(无锁)变为00(轻量级锁),高 32/64 位存的是指向当前线程栈中 Lock Record 的指针 - Lock Record 是线程私有栈帧里的一个结构,包含 Displaced Mark Word(原对象头备份)和 owner 指针等字段
- 这个过程不涉及操作系统互斥量,也不挂起线程,纯用户态原子操作
状态变化的关键细节
轻量级锁本身没有“竞争成功”的状态标识,它的状态变化只发生在加锁(CAS 写入)和解锁(CAS 恢复)两个环节:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 加锁 CAS 成功 → 对象头进入轻量级锁定态,Mark Word 指向栈中 Lock Record
- 解锁时,线程用 CAS 将 Displaced Mark Word 写回对象头;若成功,锁释放,恢复为无锁态(
01) - 若解锁时发现对象头已被其他线程修改(比如已膨胀为重量级锁),则协助升级并清理自己的 Lock Record
为什么说“CAS 竞争成功”容易误解
轻量级锁设计初衷是无竞争场景优化,它不处理真正的多线程竞争:
立即学习“Java免费学习笔记(深入)”;
- 当第二个线程尝试获取同一把轻量级锁时,CAS 会失败(因为对象头已被第一个线程改写)
- 此时 JVM 不会让其自旋等待,而是直接触发锁膨胀:将对象头升级为重量级锁(Mark Word 设置为指向 Monitor 的指针,低 3 位变为
10) - 所以所谓“CAS 竞争成功”,实际仅适用于第一个获取锁的线程;后续线程面对的是锁膨胀,而非轻量级锁下的重试逻辑
轻量级锁状态流转图示(简化)
无锁(01)→ CAS 加锁成功 → 轻量级锁定(00,指向 Lock Record)→ CAS 解锁成功 → 无锁(01)
↓ CAS 解锁失败(对象头被改)
→ 协助膨胀为重量级锁(10)

















