私は教授から与えられた書籍の試験のために勉強しています。スレッドと同期を扱うこのコードがあります:状態が変わるたびに状態変化を逃すことなく)。notifyとnotifyAllのコード/同期(理解するためのヘルプ)
public class C {
private int state = 0; // the state
private boolean modified = false; // to show if the state was changed since actualization
public synchronized void printNewState() {
while (true) {
if (!modified) {
wait();
}
System.out.println(state);
modified = false;
notify();
}
}
public synchronized void setValue(int v) {
if (modified) {
wait();
}
state = v;
notify();
modified = true;
System.out.println("value set");
}
}
そして、それが書かれています:メソッドSetValue(int型)で
しかし、(通知することを保証するものではありませんが)printNewStateスレッドをウェイクアップ! Javaでは我々はのnotifyAll(の助けを借りて、この問題 を解決)し、少しビジーウェイト取る:はを通知し、なぜ私は理解していない
public synchronized void printNewState() {
while (true) {
while (!modified) {
wait();
}
System.out.println(state);
modified = false;
**notify();** \\(?)
}
}
public synchronized void setValue(int v) {
while (modified) {
wait();
}
state = v;
notifyAll();
modified = true;
System.out.println("value set");
}
も)(のnotifyAllに変更されませんでしたか?この通知がsetValue(int)のスレッドに送られることは保証されないかもしれません???
はnotifyAll()
方法は、すべての待機中のスレッドをウェイクアップするのに対し、
notify()
方法は、単一待機中のスレッドをウェイクアップします
ちょっとGrexis、私は質問を編集しました、残念です。私はあなたの答えに興味があるtho。 – ovoxo
@ovoxo、私の編集を参照してください。 tl; drは、notifyAll()の代わりに 'notify()'がスレッドの更新だけが待っていると確信している限り意味があります。 – Grexis
あなたの答えは非常にありがとう、それは多くの助け:) – ovoxo