`hold count` 值在可重入锁中有何用处?
How is `hold count` value useful in Reentrant Lock?
Reentrant Lock (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html) 有一个特性来说明特定线程的锁定强度,该线程基于 'hold count' 的值。它在 Thread 获取锁时被初始化,并且每次当它重新获取锁时,值都会递增。每次线程调用锁上的解锁方法时,该值都会递减。
一次单个线程可以是可重入锁的所有者,因此简单的布尔标志使 mcuh 有意义而不是整数计数。已经是锁所有者的线程只能重新获取它,因此计算接缝数不多。 (任何)使用。
保持计数有什么用?它的用例是什么?一个这样的用例可以是检查当前线程是否持有锁(持有计数值 > 0)。但是有不同的 API,例如 isHeldByCurrentThread()
.
API documentation for that method 解释:
The hold count information is typically only used for testing and debugging purposes.
所以它基本上是一种可以帮助您追踪代码调用失败实例的方法 unlock()
。对于可重入使用锁的情况尤其如此。
假设你有一个包含锁定块的方法,你可以从不同的地方调用它。这个方法应该根据它持有的锁计数做不同的事情。然后你可以使用 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 by invoking it inside 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 method1 by invoking it inside method2
}
}
Reentrant Lock (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html) 有一个特性来说明特定线程的锁定强度,该线程基于 'hold count' 的值。它在 Thread 获取锁时被初始化,并且每次当它重新获取锁时,值都会递增。每次线程调用锁上的解锁方法时,该值都会递减。
一次单个线程可以是可重入锁的所有者,因此简单的布尔标志使 mcuh 有意义而不是整数计数。已经是锁所有者的线程只能重新获取它,因此计算接缝数不多。 (任何)使用。
保持计数有什么用?它的用例是什么?一个这样的用例可以是检查当前线程是否持有锁(持有计数值 > 0)。但是有不同的 API,例如 isHeldByCurrentThread()
.
API documentation for that method 解释:
The hold count information is typically only used for testing and debugging purposes.
所以它基本上是一种可以帮助您追踪代码调用失败实例的方法 unlock()
。对于可重入使用锁的情况尤其如此。
假设你有一个包含锁定块的方法,你可以从不同的地方调用它。这个方法应该根据它持有的锁计数做不同的事情。然后你可以使用 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 by invoking it inside 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 method1 by invoking it inside method2
}
}