对象刚创建时默认处于无锁状态,但能否进入偏向锁阶段取决于JVM启动时间及偏向锁开关配置:启动4秒内或禁用偏向锁时为纯无锁状态(偏向位0),4秒后且启用偏向锁时为可偏向状态(偏向位1),仅后者在首次线程加锁时通过CAS尝试升级为偏向锁。

对象刚创建时默认处于无锁状态,但是否能进入偏向锁阶段,取决于 JVM 启动时间和偏向锁开关配置。
无锁状态的两种细分情况
Java 对象头中的 Mark Word 决定锁的初始状态。在 64 位 JVM(开启压缩指针)下:
-
纯无锁状态:JVM 启动后 4 秒内创建的对象,或显式关闭了偏向锁(
-XX:-UseBiasedLocking)。此时 Mark Word 存储哈希码、分代年龄等,偏向标志位为 0,锁标志位为 01。 - 可偏向状态:JVM 默认开启偏向锁(JDK 8~14 默认启用,JDK 15+ 默认禁用),且对象在启动 4 秒后创建。此时 Mark Word 预留线程 ID 空间,偏向标志位为 1,锁标志位仍为 01。
触发无锁 → 偏向锁升级的条件
只有处于“可偏向状态”的对象,在首次被某个线程执行 synchronized 进入同步块时,才会尝试升级为偏向锁:
- JVM 检查对象头:确认偏向标志位为 1,且线程 ID 字段为空(即未被任何线程偏向)。
- 通过一次 CAS 操作,将当前线程 ID 写入 Mark Word 的线程 ID 区域。
- CAS 成功后,对象正式进入偏向锁状态——锁标志位保持 01,偏向标志位仍为 1,线程 ID 已写入。
为什么纯无锁对象不走偏向锁?
若对象属于“纯无锁状态”(如启动 4 秒内创建),即使有线程首次加锁,JVM 会跳过偏向逻辑,直接走轻量级锁流程:
立即学习“Java免费学习笔记(深入)”;
- 因为此时 Mark Word 中没有预留线程 ID 空间,无法安全记录偏向信息。
- 避免在高动态场景(如容器初始化密集期)引入不必要的偏向判断开销。
关键细节注意
偏向锁不是“自动获得”,而是“首次竞争时争取”:
- 没有线程访问时,它只是“可偏向”,不是“已偏向”。
- 多个线程几乎同时尝试首次加锁,可能因 CAS 竞争失败,导致部分线程直接触发偏向撤销,进入轻量级锁路径。
- 一旦升级为偏向锁,后续同一线程重复进入同步块,只需比对 Mark Word 中的线程 ID,无需任何原子操作。


















