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

ReentrantLock 本身没有直接提供静态方法或属性来获取“当前线程”的持有次数,但它的实例提供了 getHoldCount() 方法——这个方法**只对当前线程有效**,且必须在已持有锁的前提下调用,否则行为未定义(通常返回 0,但不可依赖)。
✅ 正确获取当前线程的 holdCount
调用锁对象的 getHoldCount() 方法即可:
- 该方法是 实例方法,属于
ReentrantLock对象本身; - 它返回的是当前正在执行该代码的线程对该锁的重入次数;
- 如果当前线程未持有该锁,返回 0;
- 必须在 已成功加锁之后(比如在
lock()后、unlock()前)调用才安全、有意义。
示例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
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 次数。
? 调试或监控场景下的小技巧
如果你想在日志中记录当前线程持锁情况,可以这样写:
if (lock.isHeldByCurrentThread()) {
System.out.printf("当前线程持有锁 %d 次%n", lock.getHoldCount());
}
搭配 isHeldByCurrentThread() 使用更健壮,避免误判 0 的含义。
❌ 常见误区
- 误以为
ReentrantLock.getHoldCount()是静态方法(实际是实例方法); - 在未加锁时调用并期望得到有意义结果;
- 试图用它检查其他线程是否持有锁(不行,需用
getQueueLength()或hasQueuedThread()等间接方式估算)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










