Thread.holdsLock(Object obj)用于检查当前线程是否持有指定对象的synchronized内置锁,仅对monitor锁有效,不支持ReentrantLock;传入null抛NullPointerException,返回值为boolean。

Thread.holdsLock 是 Java 中一个静态工具方法,用于**检查当前线程是否持有指定对象的内置锁(即 synchronized 锁)**。它不适用于 ReentrantLock 等显式锁,仅对 synchronized 块或方法起作用。
方法签名与基本用法
该方法定义为:
public static boolean holdsLock(Object obj)
参数 obj 是要检测锁的对象(不能为 null),返回 true 表示当前线程正持有该对象的 monitor 锁。
只能检测 synchronized 锁,不支持 ReentrantLock
这是关键限制:它只感知 JVM 内置的 monitor 锁,与 java.util.concurrent.locks.ReentrantLock 无关。即使你用 lock.lock() 获取了 ReentrantLock,holdsLock(obj) 仍会返回 false。
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确场景:在
synchronized(obj) { ... }块内部调用holdsLock(obj)→ 返回true - ❌ 错误假设:在
ReentrantLock.lock()后调用holdsLock(lock)→ 仍返回false,因为 lock 对象本身未被 synchronized
典型使用场景与注意事项
该方法常用于调试、断言或条件性同步逻辑中,但生产环境慎用,因其无法替代正确设计的锁协议。
- 可用于在进入临界区前做“双重检查”,例如防止意外重入(但更推荐用可重入锁的 API 或设计规避)
- 不能跨线程使用:它只判断「当前线程」是否持锁,传入其他线程持有的对象也只会返回
false - 若传入
null,抛出NullPointerException - 它不阻塞、不尝试获取锁,纯粹是快照式查询,开销极小
简单示例代码
以下代码演示其行为:
Object lock = new Object();
new Thread(() -> {
synchronized (lock) {
System.out.println(Thread.holdsLock(lock)); // true
// 其他操作...
}
}).start();
// 主线程中
System.out.println(Thread.holdsLock(lock)); // false(主线程未持锁)
注意:由于多线程时序不确定,单独靠 holdsLock 做逻辑分支易引发竞态,应结合同步结构整体设计。


















