方法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();
}
}
}
字符串
我的问题是-
lock.getHoldCount()
在这里还能返回一个数字吗,因为我们已经Assert了==0
?
1.这是否意味着没有线程可以进入assert lock.getHoldCount() == 0;
以下的行,即使它有锁?
3条答案
按热度按时间jtjikinw1#
你的问题有点不清楚但是。。
getHoldCount()总是返回一个非负数--调用线程对锁的“持有”次数。
这段代码将抛出一个AssertionError IF Assert被启用:
字符串
gorkyyrv2#
代码确保此方法是持有锁的调用层次结构中的第一个方法。
至于为什么,这是个好问题。也许作者想避免像k()->m()->l()->m()这样的情况,但这是一个可重入锁,所以我不确定作者为什么要这样做。
希望这对你有帮助。
斯拉瓦
ki0zmccv3#
是的,这个方法总是返回一个非负整数。该文档强调此方法 “通常仅用于测试和调试目的”。还有文档中的句子说“当前线程对这个锁的保持次数”,意思是你的调试线程 t[i] 调用该方法将返回 t [i] 在示例上有多少保持lock->,而你不知道 *t[j],t[k],...在锁上。
1.是否意味着没有线程可以进入assertlock.getHoldCount()== 0下面的行;
即使它有锁
如果你在运行JVM时使用选项-ea(enable assertion)->以防线程有锁,会导致程序抛出异常。(不会到达
lock.lock;
行)。相反,如果没有提到JVM选项,代码流执行将通过assert
行并在lock.lock;
行等待如果没有该选项,请忽略
assert
行