请参阅以下代码段(剥离冗余部分以突出显示有问题的情况):
FindBugs抱怨“ Method不会释放所有路径上的锁”。这是误报吗?如果没有,如何解决这个问题?
try{
someLock.lock();
//do something
} finally{
if (someLock.isLocked())
someLock.unlock();
}
答案 0 :(得分:5)
如果isLocked()
抛出某些东西,那么你就不会解锁。
我不认为让isLocked
抛出异常是可能的,但是当你锁定时,你必须解锁,测试没有意义。那么为什么不使用the javadoc中描述的标准模式:
someLock.lock();
try{
//do something
} finally{
someLock.unlock();
}
所以我说了
答案 1 :(得分:3)
<强> isLocked 强>
查询此锁是否由任何线程持有。此方法设计用于监视系统状态,不用于同步控制。
不是“用于同步控制”意味着 isLocked 的实现不能保证不受竞争条件的影响,即使我们已获得锁定它也可能返回false。
someLock.lock();
try{
//do something
} finally{
someLock.unlock();
}
或
boolean locked=false;
try{
someLock.lock();
locked=true;
//do something
} finally{
if (locked) someLock.unlock();
}
答案 2 :(得分:1)
这看起来像是误报,但我想我明白为什么你会得到它。
FindBugs规则很可能被编码为检查所有路径是否都调用unlock
...而不管是否实际需要调用(从锁定状态的角度来看)。它很可能不会尝试跟踪锁定状态,并且很可能不知道isLocked
意味着什么。虽然您和我很明显,如果unlock
返回isLocked
,则无需调用false
,但未实现FindBugs规则以进行此推断。
(事实上,对于FindBugs实现者来说,在各种用例中可靠地进行推理将是一个难题。我们处于“自动定理证明”领域......)