ReentrantLock 的 getHoldCount() 方法可获取当前线程对该锁的重入次数,需在已持锁时调用,返回值仅对当前线程有效,未持锁时返回0。

ReentrantLock 本身没有直接提供静态方法或属性来获取“当前线程”的持有次数,但它的实例提供了 getHoldCount() 方法——这个方法**只对当前线程有效**,且必须在已持有锁的前提下调用,否则行为未定义(通常返回 0,但不可依赖)。
✅ 正确获取当前线程的 holdCount
调用锁对象的 getHoldCount() 方法即可:
- 该方法是 实例方法,属于
ReentrantLock对象本身; - 它返回的是当前正在执行该代码的线程对该锁的重入次数;
- 如果当前线程未持有该锁,返回 0;
- 必须在 已成功加锁之后(比如在
lock()后、unlock()前)调用才安全、有意义。
示例:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
ReentrantLock lock = new ReentrantLock(); lock.lock(); // 第1次获取 System.out.println(lock.getHoldCount()); // 输出:1 lock.lock(); // 第2次重入 System.out.println(lock.getHoldCount()); // 输出:2 lock.unlock(); System.out.println(lock.getHoldCount()); // 输出:1(仍持有1次) lock.unlock(); // 完全释放 System.out.println(lock.getHoldCount()); // 输出:0(当前线程不再持有)
⚠️ 注意事项
- 不能跨线程使用:getHoldCount() 查的是“当前线程”,不是任意线程。你想查其他线程的持有次数?ReentrantLock 不支持,也没有公开 API;
- 非公平锁/公平锁都适用:holdCount 是重入机制的一部分,与公平性无关;
- tryLock() 成功后也能用:只要当前线程持有锁(无论通过 lock() 还是 tryLock() 获得),getHoldCount() 都有效;
- 不建议用于同步逻辑判断:比如靠 getHoldCount()==0 来决定是否 unlock() 是危险的,应严格匹配 lock/unlock 次数。
? 调试或监控场景下的小技巧
如果你想在日志中记录当前线程持锁情况,可以这样写:
立即学习“Java免费学习笔记(深入)”;
if (lock.isHeldByCurrentThread()) {
System.out.printf("当前线程持有锁 %d 次%n", lock.getHoldCount());
}
搭配 isHeldByCurrentThread() 使用更健壮,避免误判 0 的含义。
❌ 常见误区
- 误以为
ReentrantLock.getHoldCount()是静态方法(实际是实例方法); - 在未加锁时调用并期望得到有意义结果;
- 试图用它检查其他线程是否持有锁(不行,需用
getQueueLength()或hasQueuedThread()等间接方式估算)。

















