- - PR -
while文とif文
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-05-06 02:04
こんばんは。いつも勉強させていただいてます。
class Buffer { private int value; private boolean empty = true; public synchronized int getValue() { while (empty) { try { wait(); } catch (InterruptedException e) { } } empty = true; notifyAll(); return value; } public synchronized void putValue(int v) { while (!empty) { try { wait(); } catch (InterruptedException e) { } } value = v; empty = false; notifyAll(); } } このクラスでのwhile文ですが以下のようなif文でも良いような気がします。 if (empty) { try { wait(); } catch (InterruptedException e) { } } なぜwhileを使っているのでしょうか。 お教え下さると嬉しいです | ||||
|
投稿日時: 2006-05-06 02:48
そのコードは誰が書いたもので、どういう意図だと説明されていますか? それがわかると話が早いです。
ぱっと見たところ、
という仕様のように見えます。このような仕様であれば、if では駄目で while でループして状態の変化を待つ必要があります。 [ メッセージ編集済み 編集者: スフレ 編集日時 2006-05-06 02:49 ] | ||||
|
投稿日時: 2006-05-06 03:23
スフレさん早速の返信有難うございました。
生産者消費者問題のプログラムの一部で、 生産者スレッドはバッファが空でないならwait 消費者スレッドはバッファが空になったらnotifyAll 消費者スレッドはバッファが空ならwait 生産者スレッドはバッファが空でなくなったらnotifyAll というようにするクラスです。 他に生産者スレッド消費者スレッドなどがありますが、沢山webにあるので今回は省いた次第です。 | ||||
|
投稿日時: 2006-05-06 07:49
それはよろしいのですが、スフレさんの意見に対しての考えはナシですか? (それがなければ、これ以上は進まないのですが...) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-05-06 10:53
じゃんぬねっとさん御指摘有難うございました。
そしてスフレさんにもお詫び申し上げます。 スフレさんの説明良く分かりました。有難うございました。 | ||||
|
投稿日時: 2006-05-07 22:02
Java言語仕様やAPIドキュメントによると、wait()メソッドはnotifyもinterruptもtime outもしていないのにreturnする可能性があります。(このような現象を"spurious wakeup"と呼ぶようです。)
そのため、wait()は脱出条件をチェックするループの内側で使うべきだとJava言語仕様やAPIドキュメントには書かれています。 まあ、今回の例では、"spurious wakeup"が絶対に起きないと仮定しても、スフレさんが言うとおり、ifによるチェックでは正しく動作しませんが。 |
1