1. ホーム
  2. java

Java のクリティカルセクションでは、何を基準に同期を取ればいいのでしょうか?

2023-11-23 22:34:18

質問

Javaでは、コード中のクリティカルセクションを宣言する慣用的な方法は以下の通りです。

private void doSomething() {
  // thread-safe code
  synchronized(this) {
    // thread-unsafe code
  }
  // thread-safe code
}

ほとんど全てのブロックは this に同期していますが、これには特別な理由があるのでしょうか?他の可能性はありますか?どのオブジェクトに同期させるかについて、ベストプラクティスはありますか?(例えば、プライベートインスタンスの Object ?)

どのように解決するのですか?

まず、以下のコードスニペットが同一であることに注意してください。

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 の並行処理 @ Sun