6

wait() は、別のスレッドによって同じオブジェクトで notify/nofityAll が呼び出されるまでモニターを解放する同期コンテキストでのみ呼び出すことができるという事実を考慮すると、

スレッド A が wait() でブロックされ、その結果、スレッド B がロックを取得するとします。スレッド A を中断すると、制御はすぐにスレッド A に移りますか? その場合、InterrupException を処理する try catch ブロックが同期コンテキスト内にあり、一度に 1 つのスレッドしかモニターを保持できないため、スレッド B はどうなりますか? スレッド A の実行が完了するまでブロック状態に移行する必要がありますか?

前もって感謝します

4

2 に答える 2

9

ドキュメントを読むと、実際に役立ちます。

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait%28long%29

したがって、スレッドが中断されると、オブジェクトのモニターを再取得して、例外がスローされる前に同期状態を復元する必要があります。指定された時間が経過した後に wait(long) 呼び出しから戻る場合も同様です。

スレッド T は、このオブジェクトの待機セットから削除され、スレッド スケジューリングが再度有効になります。次に、オブジェクトを同期する権利を求めて、通常の方法で他のスレッドと競合します。オブジェクトの制御を取得すると、そのオブジェクトに対するすべての同期要求は、現状維持、つまり、wait メソッドが呼び出された時点の状況に復元されます。スレッド T は、wait メソッドの呼び出しから戻ります。したがって、wait メソッドから戻ると、オブジェクトとスレッド T の同期状態は、wait メソッドが呼び出されたときとまったく同じになります。

現在のスレッドが待機中に別のスレッドによって割り込まれた場合、InterruptedException がスローされます。この例外は、このオブジェクトのロック状態が上記のように復元されるまでスローされません。

于 2011-11-09T20:29:23.173 に答える
2

Aは実行可能になると思いますが、ロックを取得できるようになるまで待ってから、catch句を続行します。Bを強制的にブロック状態にすることはありません。同期されたブロックの要点は、ロックを保持しているスレッドが、ロックを解除するまで他のスレッドが同じロックで同期できないことが保証されていることです。Bを強制的にブロック状態にし、Aにロックを再取得させると、同期の本質に違反することになります。

于 2011-11-09T20:25:35.857 に答える