偏向线程ID在锁首次被获取时由JVM通过CAS原子写入Mark Word,后续重入仅比对不更新;发生竞争时可能重偏向或升级为轻量级锁;开发者无法手动修改。

偏向线程 ID 的更新不是“主动写入”或“定期刷新”,而是在锁首次被某个线程获取时,由 JVM 通过一次 CAS 操作原子地写入对象头(Mark Word)中。后续只要该线程再次进入同步块,就不再更新这个 ID,而是直接比对验证。
偏向锁建立时一次性写入
当一个线程第一次执行 synchronized 块并尝试获取锁时:
- 对象处于无锁状态(锁标志位为
01,偏向锁标志位为0); - JVM 在安全点检查是否满足启用偏向锁条件(如未禁用、已过启动延迟等);
- 执行一次 CAS 操作,将当前线程 ID 写入 Mark Word 的线程 ID 字段,同时将偏向锁标志位置为
1、锁标志位置为01; - 成功后,该对象即进入“偏向锁状态”,且偏向线程 ID 固定为此次写入的线程 ID。
后续重入不更新,只做匹配检查
同一线程再次进入该同步块时:
- JVM 仅读取 Mark Word 中存储的线程 ID,并与当前线程 ID 比较;
- 若相等,直接进入临界区,不修改对象头,也不触发任何 CAS;
- 这个过程完全避免了原子操作开销,是偏向锁性能优势的核心。
发生竞争时可能被替换(重偏向)
当其他线程尝试获取已被偏向的锁时,原偏向线程 ID 可能被新线程覆盖,但需满足特定条件:
立即学习“Java免费学习笔记(深入)”;
- 原偏向线程已退出同步块且不再活跃(JVM 通过线程列表判断其存活状态);
- 未达到批量撤销阈值(如
BiasedLockingBulkRevokeThreshold=40); - JVM 在安全点执行 CAS,将 Mark Word 中的线程 ID 替换为新线程 ID,锁仍保持偏向状态(即“重偏向”);
- 若原线程仍在执行,则偏向锁被撤销,升级为轻量级锁,此时 Mark Word 不再保存线程 ID,而是指向栈中的 Lock Record。
不可通过手动方式更新
开发者无法在代码中显式修改偏向线程 ID:
- 它由 JVM 在底层控制,不暴露 API;
- 调用
Object.hashCode()或System.identityHashCode()会强制清除偏向状态(因为需要复用 Mark Word 存储 hash 值),导致偏向锁失效; - 禁用偏向锁(
-XX:-UseBiasedLocking)或设置启动延迟为 0(-XX:BiasedLockingStartupDelay=0)会影响初始状态,但不改变更新机制。


















