观测 synchronized 锁升级必须结合对象头快照、jvm 日志和线程运行态三类手段:jol 解析 markword 识别锁状态(无锁001、偏向101、轻量000),配合 -xx:+tracebiasedlocking 等日志捕获升级事件,并用 jstack 或 threadmxbean 验证重量级锁(inflated)及阻塞态。

Java 中观测 synchronized 锁升级的实时状态,不能靠源码或字节码判断——因为锁升级是 JVM 运行时动态决策的行为,monitorenter 指令本身不携带锁类型信息。真正有效的观测必须结合对象头快照、JVM 内部日志和线程运行态三类手段,缺一不可。
用 JOL 抓取对象头 MarkWord 的瞬时值
这是最直接观察锁状态变化的方式,但需严格满足前提条件:
- 测试对象不能被 GC 回收(建议局部变量 + 立即打印,避免逃逸)
- 禁用 JIT 优化干扰:启动参数加
-XX:-TieredStopAtLevel=1 -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly(仅调试用) - 所有锁操作必须在同一线程内完成(尤其偏向锁验证阶段,线程 ID 不一致会导致撤销)
- 每次状态变更后立刻调用
ClassLayout.parseInstance(obj).toPrintable(),不要缓存引用或复用对象
关键识别位(64 位 JVM):
- 无锁:
lock=001(低 3 位) - 偏向锁:
lock=101,高位含线程 ID(注意是 JVM 内部 hash,非 OS PID) - 轻量级锁:
lock=000,中间位存栈中 Lock Record 地址(如0x0000000800000000) - 重量级锁:
JOL 通常显示为全 0 或全 1(因 monitor 指针在 native heap,JOL 不解析),此时需交叉验证
启用 JVM 锁相关诊断日志
仅靠对象头不够,尤其是重量级锁无法准确呈现。必须开启运行时日志来捕获升级事件:
-
-XX:+PrintBiasedLockingStatistics:输出偏向锁启用/撤销/失败次数 -
-XX:+TraceBiasedLocking:逐行打印偏向锁获取、撤销、重偏向过程 -
-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1:锁膨胀常触发 safepoint,高频出现说明正在升级 -
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=vm.log:配合-XX:+TraceClassLoading可捕获部分 monitor 分配记录
例如看到日志中出现 Revoking bias of object ... 或 Biased lock revocation count: 1,就表示偏向锁已被撤销并进入轻量级锁流程。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
通过 jstack 和 ThreadMXBean 查看线程阻塞态
这是验证是否进入重量级锁的最可靠方式:
- 执行
jstack -l <pid></pid>,搜索locked或waiting to lock - 若看到
(a java.lang.Object) (inflated),说明该锁已膨胀为重量级锁 - 若看到
(biased),表示仍处于偏向锁状态 - 用
ThreadMXBean编程获取锁持有者与等待者:threadMXBean.findDeadlockedThreads()或getThreadInfo(tid, true, true)获取详细锁信息
注意:轻量级锁下线程处于 RUNNABLE 状态(自旋中),而重量级锁下会明确显示 BLOCKED 并标注等待的 monitor 地址。
避开常见误判陷阱
很多现象容易被当成锁升级证据,实际并非如此:
-
wait()/notify()调用不会改变锁状态,只是线程调度协作;看到WAITING状态不等于锁变重 - 字节码里只有
monitorenter/monitorexit,永远看不出当前是哪种锁——它只表达“要上锁”,不表达“用什么锁” - JOL 显示
0x0000000000000000不代表无锁,很可能是重量级锁指针未被 JOL 解析,需以jstack为准 - 多线程竞争不是升级唯一条件:单线程对已偏向其他线程的对象加锁,也会触发偏向撤销+轻量级锁升级
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










