waitをループの中で実行しなければいけない理由

http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Object.html#wait%28long%29
ループで回さなくても、notifyAllの通知で復帰できるし、
なんでそんなことしなきゃいけないのかピンとこなかったが、APIリファレンスにちゃんと書いてるね。

スレッドは、通知、割り込み、タイムアウトなしに再開されることがあります。 これは、「スプリアスウェイクアップ」と呼ばれています。スプリアスウェイクアップは、実際にはまれにしか発生しませんが、アプリケーションでは、スレッドが再開されることで発生する可能性がある条件をテストし、条件が満たされない場合は待機を続けて、スプリアスウェイクアップから保護しなければいけません。つまり、次のようにループで常に待機が発生するようにする必要があります。

よーするに、notify、notifyAll以外でまれに再開されるから、notifyとnotifyAllからの復帰であることを明確にするために、フラグを用意してループでそれをチェックしろってこと。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です