In Java kann das Erzeuger-Verbraucher-Problem mit den Funktionen wait und notify gelöst werden.
Siehe auch
Implementierung
- Innerhalb des synchronisierten Blocks wird eine Wartebedingung formuliert
- Man muss warten, solange die Bedingung nicht erfüllt ist
- Das warten wird mit einer Schleife gelöst, in der
wait()aufgerufen wird
- Nach der Schleife wird die Änderung durchgeführt
- Nach der Änderung wird einer oder alle wartenden Threads über den Monitor benachrichtigt
- Das wird durch die Funktion
notify()odernotifyAll()gemacht
- Das wird durch die Funktion
Wichtig
waitundnotifybzw.notifyAllmüssen immer am selben Synchronisationsobjekt aufgerufen werden
Beispiel
public class Bankkonnto {
private int kontostand = 0;
public synchronized void einzahlung(int betrag) {
// 1. Wartebedingung
// Es sei hier mal nicht erlaubt, mehr als 100000
// Euro auf dem Konto zu haben
while(kontostand + betrag > 100_000) {
try {
wait();
} catch (InterruptedException ex) {
/* wird hier ignoriert */
}
}
// 2. Änderung
kontostand += betrag;
// 3. Benachrichtigen
notifyAll();
}
public synchronized void auszahlung(int betrag) {
// 1. Wartebedingung
while(kontostand - betrag < 0) {
try {
wait();
} catch (InterruptedException ex) {
/* wird hier ignoriert */
}
}
// 2. Änderung
kontostand -= betrag;
// 3. Benachrichtigen
notifyAll();
}
}
// ...