"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();
}
}