5

Thread-1がオブジェクトで同期するとします

synchronize(object){
  //statement1
  //statement2
  //statement3
}

Thread-1がstatement2でクラッシュした場合、オブジェクトのロックはどうなりますか?これが発生すると、JVMはThread-1のロックを自動的に解放しますか?そうしないと、Thread-2がオブジェクトのロックが解除されるのを待っていて、Thread-1がクラッシュした場合、Thread-2は永久に待機するためです。

4

3 に答える 3

11

JLS#14.19で定義されています:

synchronized ( Expression ) Block

何らかの理由でブロックの実行が突然完了した場合、モニターのロックが解除され、同じ理由で同期されたステートメントが突然完了します。

于 2012-09-20T22:25:35.550 に答える
6

あなたはsynchronizedブロックについて考える必要があります:

synchronized(lock) {
   // code
}

(擬似コード)と同等であるとして:

lock.acquire();
try {
   // code
} finally {
   lock.release();
}

したがって、コードセクションで何が起こっても、ロックは解放されます。

于 2012-09-21T08:26:07.277 に答える
3

はい、モニター(ロックではありません)が解放されます。

読みたい場合は、JavaVM仕様でこれについて具体的に説明します。

JVM仕様の正確なリファレンスは、セクション2.11.10にあります。

ACC_SYNCHRONIZEDが設定されているメソッドを呼び出すと、実行中のスレッドはモニターに入り、メソッド自体を呼び出し、メソッドの呼び出しが正常に完了するか突然完了するかにかかわらず、モニターを終了します。実行中のスレッドがモニターを所有している間、他のスレッドがモニターに入ることができません。同期メソッドの呼び出し中に例外がスローされ、同期メソッドが例外を処理しない場合、例外が同期メソッドから(再)スローされる前に、メソッドのモニターが自動的に終了します。

于 2012-09-20T22:24:13.667 に答える