まず、次のコードスニペットは同一であることに注意してください。
public void foo() {
synchronized (this) {
// do something thread-safe
}
}
と:
public synchronized void foo() {
// do something thread-safe
}
まったく同じことをします。コードの可読性とスタイルを除いて、どちらも優先されません。
メソッドまたはコードのブロックを同期するときは、なぜそのようなことをしているのか、どのオブジェクトを正確にロックしているのか、そしてどのような目的であるのかを知ることが重要です。
また、次の例のように、要求しているモニター(つまり同期されたオブジェクト)が必ずしもそうではないコードのブロックをクライアント側で同期したい場合があることにも注意してくださいthis
。
Vector v = getSomeGlobalVector();
synchronized (v) {
// some thread-safe operation on the vector
}
並行プログラミングについてもっと知識を身につけることをお勧めします。舞台裏で何が起こっているのかを正確に理解すれば、それはあなたに大いに役立つでしょう。このテーマに関するすばらしい本であるJavaでの並行プログラミングをチェックする必要があります。主題について簡単に詳しく知りたい場合は、Java Concurrency@Sunをチェックしてください。