JDK 15起偏向锁默认禁用且废弃,是唯一可通过JVM参数干预的锁阶段;轻量级锁和重量级锁为底层必选机制,不可禁用,其中轻量级锁自旋行为在JDK 9+由JVM自动适应调控,无公开配置参数。

Java 中 synchronized 的锁升级策略由 JVM 自动管理,不支持运行时动态开关或逐级配置,但可以通过 JVM 启动参数控制某些阶段是否启用,尤其是偏向锁。轻量级锁和重量级锁是底层必选机制,无法禁用;而偏向锁自 JDK 15 起默认关闭,是唯一可通过参数显式干预的环节。
偏向锁:唯一可配置的锁阶段
偏向锁是锁升级路径(无锁 → 偏向锁 → 轻量级锁 → 重量级锁)中唯一能通过 JVM 参数开启或关闭的环节。它的存在与否直接影响初始锁行为:
-
默认状态(JDK 15+):偏向锁已默认禁用(
-XX:-UseBiasedLocking) -
显式启用(仅限 JDK 10–14 或低版本):
-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
-
BiasedLockingStartupDelay=0表示 JVM 启动后立即启用偏向锁(默认延迟 4 秒,避免启动期误偏)
-
-
显式禁用(所有支持版本):
-XX:-UseBiasedLocking
⚠️ 注意:JDK 15 及以后版本中,
-XX:+UseBiasedLocking参数已被废弃,设置无效;即使指定,JVM 也会忽略并打印警告。
轻量级锁与自旋行为:有限微调
轻量级锁本身不可禁用,但其核心行为——自旋等待(spinning)——可通过以下参数影响:
立即学习“Java免费学习笔记(深入)”;
-
-XX:PreBlockSpin(JDK 6–8):设置固定自旋次数(如10),已废弃 -
-XX:+UseSpinning(JDK 6–8):启用自旋,也已废弃 -
JDK 9+ 使用「适应性自旋」(adaptive spinning),完全由 JVM 运行时自动决策,无公开参数控制
- JVM 根据前序同步块的平均成功获取时间、线程阻塞历史等动态调整自旋时长
- 开发者无法设定最大次数或超时阈值
重量级锁:无配置项,不可绕过
一旦升级到重量级锁:
- 依赖操作系统互斥量(Mutex),进入内核态阻塞
- 所有相关行为(如线程挂起/唤醒、Monitor 队列管理)均由 JVM 和 OS 共同完成
- 没有 JVM 参数可禁用、延迟或替换该机制
- 这是锁升级的终点,也是高竞争下的兜底保障
实用建议:如何确认当前配置生效?
-
查看 JVM 实际参数:
java -XX:+PrintFlagsFinal -version | grep Biased
输出类似:
bool UseBiasedLocking = false {product} -
验证锁状态(需 JOL 工具 + debug 模式):
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
观察 Mark Word 中的锁标志位(最后 2 位)和偏向位(倒数第 3 位)
-
生产环境推荐配置:
- JDK 17/21:无需额外参数,默认已禁用偏向锁,轻量级锁 + 适应性自旋 + Monitor 全链路可用
- 若确定无单线程长期持有场景,可显式加
-XX:-UseBiasedLocking(虽冗余,但语义清晰) - 不要尝试“强制保持偏向锁”或“禁用轻量级锁”——JVM 不提供这类能力,强行干扰反而破坏稳定性
不复杂但容易忽略


















