最好在try块内部使用synchronized块或在synchronized块内部使用try块?

use*_*212 20 java multithreading try-catch synchronized-block

例如,这更好吗?

try {
    synchronized (bean) {
        // Write something              
    }
} catch (InterruptedException e) {
    // Write something
}
Run Code Online (Sandbox Code Playgroud)

或者这更好:

synchronized (bean) {
    try {           
        // Write something              
    }
    catch (InterruptedException e) {
        // Write something
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道哪一个是最佳实践.显然考虑到我必须同步try块中的所有代码.我不是在谈论我只能在try中同步部分代码的情况(在这种情况下,我认为在try中包含synch块会更好).我的疑问是关于我要同步所有try块的情况.

Gra*_*ray 13

最好在try块内部使用synchronized块或在synchronized块内部使用try块?

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

也就是说,如果synchronized块包含多行(当然通常不是一个好主意),那么我会考虑将try/catch块移动到更接近抛出异常的方法(prolly waitnotify).如果使用大量的行,则存在使用大型try/catch块不正确地处理异常的风险.在这里取决于参考框架.

另外,请确保至少记录中断的异常.永远不要忽视它们.您可能还想重新中断该线程:

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