1

请参考以下代码片段(去掉多余部分以突出问题案例):

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

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

3 回答 3

5

如果isLocked()扔东西,那么你不会解锁。

我认为不太可能isLocked抛出异常,但是当你锁定时,你必须解锁,测试没有意义。那么为什么不使用javadoc中描述的标准模式:

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

所以我说

  • 这是一个误报,因为您的代码无法解锁
  • 从某种意义上说,这是一个真正的积极因素,您应该根据建议修复您的代码
于 2013-03-21T12:31:22.037 回答
3

锁住了

查询此锁是否由任何线程持有。此方法设计用于监控系统状态,而不是用于同步控制

不是“用于同步控制”意味着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();
}
于 2013-03-21T12:31:06.613 回答
1

这看起来像是一个误报,但我想我可以理解你为什么会得到它。

FindBugs 规则最有可能被编码为检查所有路径是否调用unlock......而不管调用是否实际需要(从锁状态的角度来看)。它很可能不会尝试跟踪锁的状态,并且很可能不知道是什么isLocked 意思。虽然对您和我来说很明显没有必要调用unlockif isLockedreturns false,但并未实施 FindBugs 规则来进行此推断。

(事实上​​,在广泛的用例中可靠地进行推理对于 FindBugs 实现者来说是一个难题。我们处于“自动定理证明器”领域......)

于 2013-03-21T13:06:00.560 回答