debugging Java lock和getHoldCount()

k2fxgqgv  于 2023-08-06  发布在  Java
关注(0)|答案(3)|浏览(84)

方法assert lock.getHoldCount()== 0;下面的例子来自Java文档,上面写着Returns: the number of holds on this lock by the current thread, or zero if this lock is not held by the current thread,我不太明白。

class X {
      ReentrantLock lock = new ReentrantLock();
      // ...
   public void m() {
        assert lock.getHoldCount() == 0;
        lock.lock();
        try {
           // ... method body
        } finally {
           lock.unlock();
        }
   }
 }

字符串
我的问题是-

  1. lock.getHoldCount()在这里还能返回一个数字吗,因为我们已经Assert了==0
    1.这是否意味着没有线程可以进入assert lock.getHoldCount() == 0;以下的行,即使它有锁?
jtjikinw

jtjikinw1#

你的问题有点不清楚但是。。
getHoldCount()总是返回一个非负数--调用线程对锁的“持有”次数。
这段代码将抛出一个AssertionError IF Assert被启用:

lock.lock();  //sets the hold count > 0, so...
m();          //...the assertion in m() will fail.

字符串

gorkyyrv

gorkyyrv2#

代码确保此方法是持有锁的调用层次结构中的第一个方法。
至于为什么,这是个好问题。也许作者想避免像k()->m()->l()->m()这样的情况,但这是一个可重入锁,所以我不确定作者为什么要这样做。
希望这对你有帮助。
斯拉瓦

ki0zmccv

ki0zmccv3#

  1. lock.getHoldCount()在这里还能返回一个数字吗,因为我们已经Assert== 0了?
    是的,这个方法总是返回一个非负整数。该文档强调此方法 “通常仅用于测试和调试目的”。还有文档中的句子说“当前线程对这个锁的保持次数”,意思是你的调试线程 t[i] 调用该方法将返回 t [i] 在示例上有多少保持lock->,而你不知道 *t[j],t[k],...在锁上
    1.是否意味着没有线程可以进入assertlock.getHoldCount()== 0下面的行;
    即使它有锁
    如果你在运行JVM时使用选项-ea(enable assertion)->以防线程有锁,会导致程序抛出异常。(不会到达lock.lock;行)。相反,如果没有提到JVM选项,代码流执行将通过assert行并在lock.lock;行等待
    如果没有该选项,请忽略assert

相关问题