没有抛出异常时尝试最终锁定

Try-finally with lock when no exception is thrown

在java手册中说在使用lock()和unlock()时建议使用try-finally,但是在try块中从不抛出异常时这也是必要的吗?例如:

mutex.lock();
try 
{
    x++
} finally {
    mutex.unlock();
}

经常这样做是个好习惯。

那么您就不必担心试图找出锁内的代码是否抛出或不抛出(无论是现在还是将来代码更改)。

就像一个数据点,不使用try/finally锁is flagged in Google's code reviews,不管你在持有锁时做什么。

使用try/finally基本上没有成本;但是在需要时使用它确实会非常昂贵。

始终添加它是一个合理的建议:

  • 对于初学者,因为他们可能不知道所有可能引发异常的方式。
  • 对于更有经验的开发人员,因为它避免了稍后忘记添加它,而且正如 Andy Turner 在 中正确指出的那样,它基本上是免费的。

如果你能证明没有办法抛出异常,那么你就不需要try-catch块。

但您需要记住,如果您以后决定向该部分添加更多代码,则必须添加它。

一些静态代码分析工具将不使用它标记为潜在问题 - 它们通常不会尝试证明某段代码不能抛出异常,这通常很难做到。

这只是标准做法。将来,有人可以将那行代码更改为函数调用,这可能会引发异常。所以最好用finally让异常正常传播。