繁体   English   中英

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

[英]How is `hold count` value useful in Reentrant Lock?

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

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

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

方法API文档解释了它:

保持计数信息通常仅用于测试和调试目的。

所以它基本上是一种方法,可以帮助您跟踪代码无法调用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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM