我看到有人要用
assert !Thread.holdsLock(lock)
以避免死锁。
这是为了什么目的?如果锁定对象由另一个线程持有,那么断言会导致代码立即退出吗?
答案 0 :(得分:7)
当且仅当当前线程持有监视器锁时才返回
true
在指定的对象上。
(强调我的)
因此,断言检查当前线程是否不保持给定锁定对象的监视器锁定。
请注意,断言用于检查不变量,可以禁用。它们不应该用于防止死锁。应该使用常规的if
测试来做到这一点。
答案 1 :(得分:3)
assert
关键字用于捕获错误;它永远不应该用于控制程序流程。所以要么是误解,要么是有人在做错事
更有可能的是,该人将断言声明放在那里以防止开发人员在该代码段中添加死锁危险。
像这样:
assert !Thread.holdsLock(lock) :
"Don't call this method while holding the lock." +
"This method tries to acquire lock2 and that may cause a deadlock.";
答案 2 :(得分:1)
当线程一次获取并持有多个锁时,死锁是一个常见问题。避免此问题的一种简单方法是确保始终以相同顺序获取多个锁,并以相同(反向)顺序释放多个锁。所以先锁(A),再锁(B)。解锁(B),然后解锁(A)。看起来很简单,但是这些乱序的锁定/解锁问题有一种潜入代码的方式。
因此,在锁定A之前,请确保我们尚未持有B。
声明!Thread.holdsLock(B)
答案 3 :(得分:0)
Thread.holdsLock(lock)
仅用于检查调用线程是否拥有lock
,就是这样。
它会不防止死锁(如果有这样的方法会很棒:))