轻量级锁是jvm自动启用的优化机制,适用于低竞争场景;它通过cas操作在栈帧中创建lock record实现快速加解锁,无需开发者干预,且与synchronized代码完全兼容。

Java 中轻量级锁不是由开发者显式创建或调用的,而是 JVM 在运行时自动启用的一种优化机制,专为“多线程访问错开、竞争不激烈”的场景设计。你只需正确使用 synchronized,JVM 就会在合适时机悄悄启用轻量级锁——无需额外配置,也不依赖特定 API。
下面从实际角度说明它如何在低竞争场景下工作和生效:
轻量级锁生效的前提条件
它不会无条件启用,需同时满足:
- 锁对象未被偏向(或偏向已撤销)
- 当前线程尝试获取锁时,该锁处于无锁状态或已被当前线程持有(重入)
- 没有其他线程正在并发争抢这把锁(即 CAS 替换 Mark Word 大概率成功)
举例:两个线程交替执行
synchronized(obj),中间有明显时间间隔(如含Thread.sleep(10)),JVM 很可能全程使用轻量级锁,避免进入重量级锁路径。
加锁过程:核心是 CAS + 栈帧锁记录
当线程进入 synchronized 块时,JVM 会:
- 在当前线程的栈帧中分配一块空间,创建一个 Lock Record(锁记录)
- 把锁对象头(Mark Word)的当前值复制进该记录
- 使用 CAS 操作,尝试把对象头替换成指向这个 Lock Record 的指针
- 若成功 → 锁获取完成,进入临界区(耗时约 10–100 纳秒)
- 若失败 → 表示已有别的线程抢先加锁,此时可能自旋重试,或直接升级为重量级锁
解锁过程:快速恢复,不触发系统调用
退出 synchronized 块时:
- JVM 检查锁记录中保存的原始 Mark Word 是否仍匹配当前对象头
- 若匹配,用 CAS 把原始值写回对象头 → 解锁完成
- 若不匹配(比如已被升级为重量级锁),则交由 Monitor 机制处理
如何让轻量级锁更大概率被启用
你可以通过编码习惯“配合” JVM 优化:
- 避免长时间持有锁:把耗时操作(如 I/O、网络调用)移出
synchronized块 - 减少锁粒度:用细粒度对象做锁(如
new Object()),而非this或类对象 - 控制线程行为:避免多个线程高频、密集地争抢同一把锁(例如用队列削峰)
- 不主动禁用优化:确保 JVM 参数未关闭锁优化(如
-XX:-UseBiasedLocking会影响轻量级锁触发时机)
它和你写的代码完全兼容
你不需要改写同步逻辑。这段代码:
private final Object lock = new Object();
public void doWork() {
synchronized(lock) {
// 短暂的共享变量操作
counter++;
}
}
在低竞争下,JVM 自动走轻量级锁路径;一旦竞争变强(比如 10 个线程同时冲进来),它会无缝升级为重量级锁——整个过程对业务代码透明。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











