可重入锁定(https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html)具有一种功能,可以说明特定线程的锁定强度,该线程基于'保持计数'的值。当线程获取锁定时它被启动,并且每当它重新获取锁定时值增加。每次线程调用锁上的解锁方法时,该值都会递减。
一次一个线程可以是Reentrant Lock的所有者,因此简单的boolen标志使得mcuh sense而不是整数计数。已经是锁的所有者的线程只能重新获取它,所以计算接缝数量不多。 (任何)使用。
保持计数的用处是什么?有什么用例?一个这样的用例可以是检查当前线程是否持有锁(保持计数值> 0)。但是有不同的API,例如isHeldByCurrentThread()
。
答案 0 :(得分:2)
API documentation for that method解释了它:
保持计数信息通常仅用于测试和调试目的。
所以它基本上是一种方法,可以帮助您跟踪代码无法调用unlock()
的实例。对于您可以重复使用锁的情况尤其如此。
答案 1 :(得分:1)
假设您有一个包含锁定块的方法,您可以从不同的地方调用它。根据它所持有的锁定计数,该方法应该做不同的事情。然后,您可以使用getHoldCount
。
import java.util.concurrent.locks.ReentrantLock;
public class Example {
ReentrantLock lock = new ReentrantLock();
void method1() {
lock.lock();
try {
if (lock.getHoldCount() == 1) {
System.out.println("call method1 directly");
} else if (lock.getHoldCount() == 2) {
System.out.println("call method1 from method2");
}
} finally {
lock.unlock();
}
}
void method2() {
lock.lock();
try {
method1();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
Example example = new Example();
example.method1(); // call method1 directly
example.method2(); // call method2 from method2
}
}