轻量级锁的核心优势是完全避免操作系统级线程阻塞与唤醒开销,并绕过Monitor和内核态切换;它通过CAS操作在用户态完成加解锁,线程保持RUNNABLE状态,Lock Record在栈帧中管理,零GC压力且语义透明,比偏向锁更适配多线程交替场景。

轻量级锁在无竞争、线程交替执行同步块的场景下,核心优势是完全避免操作系统级线程阻塞与唤醒开销,同时绕过重量级锁依赖的 Monitor(对象监视器)和内核态切换。这不是“稍快一点”,而是从机制层面消除了一类高成本操作。
不触发线程状态切换
当 Thread-A 执行完 synchronized 块并释放轻量级锁后,Thread-B 紧接着进入同一把锁的同步块,只要中间没有竞争,整个过程全程在用户态完成:
- 加锁靠 CAS 更新对象头 Mark Word,失败才升级;成功则仅改标志位为“00”(轻量级锁定态)
- 解锁时用 CAS 将原始 Mark Word 恢复,无需调用操作系统接口
- 线程始终处于 RUNNABLE 状态,不会进入 BLOCKED 或 WAITING,也就没有 JVM 线程调度和内核上下文切换
栈帧内完成锁记录管理
每个线程在自己的 Java 栈帧中分配 Lock Record,用于暂存被锁对象的 Mark Word 备份:
- Lock Record 生命周期与同步块绑定,随方法调用/返回自动压栈/出栈
- 无堆内存分配压力,不触发 GC;也不依赖全局锁表或 Monitor 对象
- 重入时只需新增一条 Lock Record,计数逻辑纯栈内操作,零共享、零同步
保持 synchronized 语义透明性
开发者无需修改任何代码,synchronized 关键字行为不变,但底层已跳过重量级路径:
立即学习“Java免费学习笔记(深入)”;
- 锁重入、异常退出、嵌套同步等语义均由 JVM 在轻量级锁流程中完整支持
- 对象头中锁标志位和指向 Lock Record 的指针共同维护锁状态,可被 GC 安全识别
- 相比 ReentrantLock 等显式锁,没有 try-finally 模板代码负担,也没有额外对象创建开销
对比偏向锁更适应交替场景
偏向锁适合“单一线程长期持有”,一旦发生第二次线程访问就会撤销并升级;而轻量级锁天然适配交替模式:
- Thread-A 和 Thread-B 轮流获取同一把锁,每次都是新线程尝试 CAS,不涉及偏向撤销开销
- 无须等待“安全点”来批量撤销偏向,也规避了撤销导致的 STW 风险
- 即使开启偏向锁,JVM 在检测到多线程交替访问后也会快速禁用该对象的偏向,转而走轻量级锁路径


















