21

たとえば、これは良いですか?

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

または、これの方が良いです:

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

どれがベストプラクティスなのか疑問に思っていました。当然のことながら、try ブロック内のすべてのコードを同期する必要があります。try 内のコードの一部のみを同期する必要がある場合について話しているのではありません (この場合、try 内に synch ブロックを配置する方がよいと思います)。私の疑問は、すべての try ブロックを同期する必要がある場合です。

4

6 に答える 6

14

try ブロック内に同期ブロックを配置するか、同期ブロック内に try ブロックを配置する方がよいですか?

明示的catchsynchronizedブロックに含める必要がない限りsynchronized、コードのセクションをできるだけ小さくして、try/catch 内に配置します。したがって、最初のパターンの方が適しています。次に、セクションで操作を行う必要がある場合catch(例外をログに記録する、スレッドを再中断するなど、以下を参照)、これらは他のスレッドをブロックしません。

とは言っても、synchronizedブロックに多数の行が含まれている場合 (通常はもちろん良い考えではありません)、try/catch ブロックを例外をスローするメソッド (prollywaitまたはnotify) の近くに移動することを検討します。行数が多いと、大きな try/catch ブロックで例外を不適切に処理するリスクがあります。ここでの参照フレームに少し依存します。

余談ですが、少なくとも中断された例外をログに記録するようにしてください。それらを無視しないでください。おそらく、スレッドを再中断することもできます。

try {
   ...
} catch (InterruptedException e) {
   // always a good pattern
   Thread.currentThread().interrupt();
   // handle the interrupt here by logging or returning or ...
}
于 2013-02-18T20:19:13.923 に答える
3

ベスト プラクティスはありません。同期ブロック内に例外処理部分が必要かどうかのみに依存します。どちらか一方が必要な場合があり、コードを正しくスレッドセーフにしながら、同期ブロックを最短にするものを選択する必要があります。

于 2013-02-18T20:20:30.243 に答える
2

あなたは、これは単なる審美的な問題だと考えているようです。そうではありません。これは機能的な問題であり、答えは個々のケースの要件によって決まります。同期された各ブロックは、同期する必要があるものをすべて含めるのに必要な大きさにする必要があります。

于 2013-02-18T23:02:22.983 に答える
0

catch ブロックが同期されているかどうかは重要ですか? そこに「何かを書く」ことができたので、適切なロギングフレームワークと同期する必要のないロギングを行うと仮定します。これは、答えがおそらくnoであることを意味します。

一般に、同期の使用をできるだけ少なくすることを目標にする必要があります。同期ブロックが小さいほど、問題が発生する可能性が低くなります。

于 2013-02-18T20:19:55.720 に答える
0

この場合、またはまたはを呼び出すことができるブロックInterruptedException内でのみ発生する可能性があります。 synchronizedwaitsleepnotify

一般に、ベスト プラクティスは、try/catchブロックを例外をスローする可能性のあるコードのできるだけ近くに配置して、修正するコードを簡単に識別できるようにすることです。

于 2013-02-18T20:20:44.030 に答える
0

またはとは関係ありませんが、すべてはsynchronized{try{}}またはと関係があります。それは本当に catch ブロックで何をするかに依存します。try{synchronized{}}synchronized{catch{}}synchronized{} catch{}

ただし、推測すると、InterruptedException通常はcatch{}の外で行う必要がありsynchronized{}ます。

于 2013-02-18T20:33:55.023 に答える