“保持计数”值如何在重入锁中有用?

时间:2018-04-20 11:58:04

标签: java multithreading reentrantlock

可重入锁定(https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html)具有一种功能,可以说明特定线程的锁定强度,该线程基于'保持计数'的值。当线程获取锁定时它被启动,并且每当它重新获取锁定时值增加。每次线程调用锁上的解锁方法时,该值都会递减。

一次一个线程可以是Reentrant Lock的所有者,因此简单的boolen标志使得mcuh sense而不是整数计数。已经是锁的所有者的线程只能重新获取它,所以计算接缝数量不多。 (任何)使用。

保持计数的用处是什么?有什么用例?一个这样的用例可以是检查当前线程是否持有锁(保持计数值> 0)。但是有不同的API,例如isHeldByCurrentThread()

2 个答案:

答案 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
    }
}