`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
    }
}