threadinfo.getlockedsynchronizers()仅返回当前线程已成功获取的java.util.concurrent.locks.lock实例(如reentrantlock、reentrantreadwritelock.readlock/writelock等),不包括synchronized隐式锁、未获取锁、已释放锁及stampedlock。

ThreadInfo.getLockedSynchronizers() 返回当前线程持有的 java.util.concurrent.locks.Lock 类型的显式锁(如 ReentrantLock),**不包括 synchronized 关键字隐式获取的对象监视器锁(monitor lock)**。
它能拿到哪些锁?
仅返回通过 Lock.lock()、lockInterruptibly() 等方式成功获取的 java.util.concurrent.locks.Lock 实例,例如:
-
ReentrantLock(可重入锁) -
ReentrantReadWriteLock.ReadLock或.WriteLock - 自定义实现
Lock接口的锁(只要已加锁且被 JVM 识别)
它不能拿到哪些锁?
以下锁不会出现在返回结果中:
- 所有
synchronized块或方法持有的 monitor 锁(即对象内置锁) - 尚未成功获取的锁(比如被阻塞在
lock()调用上) - 已释放但未被 GC 的锁对象(只统计当前持有状态)
-
StampedLock的悲观读锁/写锁(它不实现Lock接口)
怎么用才有效?
该方法需配合 ThreadMXBean 使用,且目标线程必须处于活跃状态(RUNNABLE、BLOCKED、WAITING 等),典型用法:
- 调用
ManagementFactory.getThreadMXBean().getThreadInfo(threadId, true, true),第三个参数为true表示包含同步器信息 - 再对返回的
ThreadInfo调用getLockedSynchronizers() - 注意:JVM 需开启锁监控(默认开启;若关闭过,需加
-XX:+UseThreadPriorities -XX:+UseBiasedLocking等不影响,但禁用锁优化可能影响可见性)
常见误区提醒
别把它和 getLockedMonitors() 混用:
-
getLockedMonitors()查的是synchronized锁住的对象(monitor) -
getLockedSynchronizers()查的是java.util.concurrent.locks.Lock实例 - 两者互补,合起来才能较完整反映线程的锁持有情况










