最好在 try 块中有一个同步块,或者在同步块中设置一个 try 块?

例如,这样更好吗?

try {
    synchronized (bean) {
        // Write something              
    }
} catch (InterruptedException e) {
    // Write something
}

或者更好的是这个:

synchronized (bean) {
    try {           
        // Write something              
    }
    catch (InterruptedException e) {
        // Write something
    }
}

我想知道哪一个是最佳实践。显然,考虑到我必须同步try块内的所有代码。我不是在谈论我必须在尝试中仅同步部分代码的情况(在这种情况下,我认为最好在尝试中具有同步块)。我的疑问是关于我必须同步所有尝试块的情况。


答案 1

最好在 try 块中有一个同步块,或者在同步块中设置一个 try 块?

除非你明确需要在块中,否则我会使代码部分尽可能小,并将其放在try/catch中。所以第一种模式会更好。然后,如果您确实需要在该部分中执行操作(例如记录异常或重新中断线程,见下文),这些操作不会阻止其他线程。catchsynchronizedsynchronizedcatch

也就是说,如果块包含许多行(当然通常不是一个好主意),那么我会考虑将try/catch块移动到更接近引发异常的方法(prolly or )。对于大量行,您冒着不正确地处理具有大型 try/catch 块的异常的风险。这有点取决于这里的参考框架。synchronizedwaitnotify

顺便说一句,请确保至少记录中断的异常。永远不要忽视他们。您可能还想重新中断线程:

try {
   ...
} catch (InterruptedException e) {
   // always a good pattern
   Thread.currentThread().interrupt();
   // handle the interrupt here by logging or returning or ...
}

答案 2

没有最佳做法。这仅取决于您是否需要同步块内的异常处理部分。您可能想要一个或另一个,并且应该选择使同步块最短的那个,同时仍然使代码正确且线程安全。