以下はJavaでのアトミック・ウェイトの変換です。 while
の必要性は何ですか? if
で十分ですか?Javaでのアトミック・ウェイティングの実装
///<await (condition) statements; >
synchronized(obj)
{
while (!condition)
{
obj.wait();
}
statements;
}
以下はJavaでのアトミック・ウェイトの変換です。 while
の必要性は何ですか? if
で十分ですか?Javaでのアトミック・ウェイティングの実装
///<await (condition) statements; >
synchronized(obj)
{
while (!condition)
{
obj.wait();
}
statements;
}
誰かがあなたにnotify
を送ったという理由だけで条件がtrueになりました(あるいはまだ本当である)ことを意味するものではありませんので、あなたは、while
を必要としています。
すべてnotify
は、待機中のスレッド(同じモニター上でさえも、さまざまな条件で待機することができます)を伝えます。彼らはまだwait
が必要かどうかを評価する。
実際に必要な理由は2つあります。
最初に、モニタの所有者がnotifyAll()
を呼び出すと、待機中のすべてのスレッドが次々に起動されるため、前のスレッドのいずれかが条件を変更した場合、それに関する仮定はもう真ではありません。
第2の理由はSpurious wakeupです。ほとんどのJVM実装はオペレーティングシステムのスレッディングモデルに依存しており、それらのうちのいくつかは(パフォーマンスのために)偽の起動を可能にするため、そのような場合に備える必要があります。
Doug Leaは、「while」を取り除くことができるまれな状況を解決しようとしている状態にあることをDoug Leaがコメントしていると思います。偽の目覚めによって、あなたはそれを必要とするので、この分野では無意味な議論の必要はありません。 –
疑似ウェークアップの存在は、ループで常に待ちが発生することを暗示しているので、私の答えはDoug Leaの「Javaにおける並行プログラミング」の本に矛盾していません。 –