- PR -

while文とif文

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/05/06
投稿数: 3
投稿日時: 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を使っているのでしょうか。
お教え下さると嬉しいです
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2006-05-06 02:48
そのコードは誰が書いたもので、どういう意図だと説明されていますか? それがわかると話が早いです。

ぱっと見たところ、

  • putValue()で置いた値は、一度だけgetValue()で取り出すことができる
  • putValue()を呼んだときに既に値が置かれている場合は、誰かがgetValue()するまで待つ
  • getValue()を呼んだときに値が置かれていない場合は、誰かがputValue()するまで待つ

という仕様のように見えます。このような仕様であれば、if では駄目で while でループして状態の変化を待つ必要があります。


[ メッセージ編集済み 編集者: スフレ 編集日時 2006-05-06 02:49 ]
未記入
会議室デビュー日: 2006/05/06
投稿数: 3
投稿日時: 2006-05-06 03:23
スフレさん早速の返信有難うございました。

生産者消費者問題のプログラムの一部で、
生産者スレッドはバッファが空でないならwait
消費者スレッドはバッファが空になったらnotifyAll
消費者スレッドはバッファが空ならwait
生産者スレッドはバッファが空でなくなったらnotifyAll
というようにするクラスです。
他に生産者スレッド消費者スレッドなどがありますが、沢山webにあるので今回は省いた次第です。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-06 07:49
引用:

hiddenさんの書き込み (2006-05-06 03:23) より:

生産者消費者問題のプログラムの一部で、
生産者スレッドはバッファが空でないならwait
消費者スレッドはバッファが空になったらnotifyAll
消費者スレッドはバッファが空ならwait
生産者スレッドはバッファが空でなくなったらnotifyAll
というようにするクラスです。
他に生産者スレッド消費者スレッドなどがありますが、沢山webにあるので今回は省いた次第です。


それはよろしいのですが、スフレさんの意見に対しての考えはナシですか?
(それがなければ、これ以上は進まないのですが...)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2006/05/06
投稿数: 3
投稿日時: 2006-05-06 10:53
じゃんぬねっとさん御指摘有難うございました。
そしてスフレさんにもお詫び申し上げます。
スフレさんの説明良く分かりました。有難うございました。
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2006-05-07 22:02
Java言語仕様APIドキュメントによると、wait()メソッドはnotifyもinterruptもtime outもしていないのにreturnする可能性があります。(このような現象を"spurious wakeup"と呼ぶようです。)
そのため、wait()は脱出条件をチェックするループの内側で使うべきだとJava言語仕様やAPIドキュメントには書かれています。

まあ、今回の例では、"spurious wakeup"が絶対に起きないと仮定しても、スフレさんが言うとおり、ifによるチェックでは正しく動作しませんが。
1

スキルアップ/キャリアアップ(JOB@IT)