"Grundkurs Programmieren in Java (8. Auflage, 2018)"
2003-2018, Carl Hanser Verlag

Lösungsvorschlag zu Aufgabe 16.2 (Version 2.0)

(c) 2003-2018 D. Ratz, D. Schulmeister-Zimolong, D. Seese, J. Wiesenberger

Man muss dafür sorgen dass jeder Verbraucher, der durch notify geweckt wird auch nochmals überprüft, ob tatsächlich ein Wert bereit steht, bevor er aktiv wird. Ebenso muss jeder Erzeuger nach dem Aufwachen sicherstellen, dass ein Wert erzeugt werden darf. Es genügt daher in den Methoden get und put die if-Anweisung durch eine while-Anweisung zu ersetzen.
class BessererWert extends Wert {
  private boolean verfuegbar = false;

  public synchronized int get() {
    while (!verfuegbar)
      try {
        wait();
      }
      catch (InterruptedException ie) {
      }
    verfuegbar = false;
    notify();
    return wert;
  }

  public synchronized void put (int w) {
    while (verfuegbar)
      try {
        wait();
      }
      catch (InterruptedException ie) {
      }
    wert = w;
    verfuegbar = true;
    notify();
  }
}