一、锁升级的本质:JVM 的'自适应并发优化'
核心思想: '大多数锁在运行时没有竞争,或竞争时间极短。与其一开始就使用重量级锁,不如先尝试更轻量的方式。'
锁状态演进路径(HotSpot 64 位 JVM)
无锁 → 偏向锁(Biased Locking) → 轻量级锁(Lightweight Locking) → 重量级锁(Heavyweight Locking)
⚠️ 关键特性:单向升级:锁只能升级,不能降级(除 GC 或显式撤销)基于对象头 Mark Word 状态切换****由 JVM 自动决策,开发者无需干预
二、深入原理 + 场景 + 代码示例
1. 偏向锁(Biased Locking)—— 单线程的极致优化
🔬 底层原理
- 对象头 Mark Word 中存储 偏向线程 ID
- 同一线程再次进入同步块时,仅比对线程 ID,无需 CAS
- 若对象未计算过 hashCode,则用 hashcode 字段存储线程 ID
Mark Word 结构(偏向锁状态):
| unused:25 | thread_id:54 | epoch:2 | age:4 | biased_lock:1 | lock:01 |
🎯 典型场景
- Spring 单例 Bean 中的 synchronized 方法被同一线程反复调用
- 批处理任务(如定时对账、数据清洗)
代码示例 & 验证
public class SingleThreadDemo {
private final Object lock = new Object();
public void processBatch(List<Data> dataList) {
// 同一线程循环进入,触发偏向锁
for (Data data : dataList) {
synchronized (lock) {
// 业务逻辑
handle(data);
}
}
}
}

