Findbugs的可能误报?

时间:2013-03-21 12:25:17

标签: java findbugs java.util.concurrent

请参阅以下代码段(剥离冗余部分以突出显示有问题的情况):

FindBugs抱怨“ Method不会释放所有路径上的锁”。这是误报吗?如果没有,如何解决这个问题?

  try{
      someLock.lock();
     //do something
    } finally{
      if (someLock.isLocked())
        someLock.unlock();
    }

3 个答案:

答案 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实现者来说,在各种用例中可靠地进行推理将是一个难题。我们处于“自动定理证明”领域......)