0

ネストされた2つのロックがあるとします(ここではJavaに関するものです)</p>

synchronized (clientInfMutex) {
...
    synchronized (clientInfMutex) {
        //Will this part executable?


  }


}

内部は実行可能ですか?懸念事項は、外側のロックがロックを取得しているときに、内側のロックがロックを再度ロックできない可能性があることです。内側の部分が実行できない場合、外側のロックで既にロックを保持している場合、問題なく内側のロックにアクセスできるようなメカニズムはありますか? ありがとう。

4

3 に答える 3

4

はい。スレッドにはすでにロックがあるためです。Java ネイティブ ロックは再入可能です

JVM が同期ブロックにヒットするたびに、そのロックがあるかどうかを確認し、ない場合はそのロックを待機するか、そうでない場合はそのロックの内部カウンターをインクリメントして、囲まれたブロックを実行します。

clientInfMutexこれは、 が両方のステートメントで同じオブジェクトを指していると仮定していることに注意してください。たとえば、clientInfMutex = new Object()2 つの同期ブロック間で実行した場合、スレッドは新しいオブジェクトのロックを待機します。

于 2012-09-30T11:19:39.817 に答える
2

これで問題なく動作します。スレッドが既にsynchronizedブロックを介してロックを取得している場合は、複数回再取得できます。この機能は再入可能同期と呼ばれます。

thisこれは、シンクロナイザーとして暗黙的に使用されている場合にも機能することに注意してください。

public synchronized void foo() {
    bar();  //will NEVER block
}

public synchronized void bar() {
}

ところで、サンプルの 2 つのコード ブロックは、呼び出した名前と同じ名前ではなく、同じobjectで同期しています。

于 2012-09-30T11:22:52.920 に答える
0

Java の Object のすべてのインスタンスは、単一のロック参照を保持します。つまり、使用している二重ロックは、実際にはオブジェクトを一度だけロックします。つまり、オブジェクトによってロックされているブロックにいる間は、再度ロックしても効果がありません。

于 2012-09-30T11:23:11.200 に答える