2 つのスレッドがあり、Thread2 は Thread1 を待機します (スレッドからメッセージを受信します)。
class Thread1 .. {
run() {
synchronized(this) { some-work; notify(); }
}
}
class Thread2 .. {
run() {
while(true) {
synchronized(thread1) {
...
thread1.wait();
...
println("Got here"); // has received the notify() from Thread1
}
}
}
}
- thread2.start() // スレッド 2 は、最初にスレッド 1 からすべてのメッセージを受信する準備ができています
- thread1.start()
これらのスレッドをその順序で開始した後、スレッド 2 がスレッド 1 からの notify() を待機している状況が発生し、これは数秒後に発生します。「Got here」というメッセージが表示されます。
しかし、ここで遅延を設定すると:
class Thread2
run() {
while(true) {
sleep(1000); // the dalay
synchronized(thread1) { ..
}
その後、'Got Here' というメッセージは表示されません。これは、syncronized(thread1) に到達する前に thread2 が thread1 からの notify() を見逃すためです。
質問は:
1. これらの 2 行はアトミックですか。または、これらの 2 つの行の間のこのギャップはアトミックですか?:
while(true) {
// gap
synchronized(thread1) {..thread.wait() ..}
}
2. または、while() と同期ブロックの間に式を入れてはならないということですか? たとえば、次のようになります。
while(true) {
int a = 0; a++;
synchronized(thread1) {..thread.wait() ..}
そこにそれらの表現があるため、「待つ必要がない」状況のリスクがありますか?