In Java kann das Erzeuger-Verbraucher-Problem mit den Funktionen wait und notify gelöst werden.

Implementierung

  1. 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
  2. Nach der Schleife wird die Änderung durchgeführt
  3. Nach der Änderung wird einer oder alle wartenden Threads über den Monitor benachrichtigt
    • Das wird durch die Funktion notify() oder notifyAll() gemacht

Wichtig

wait und notify bzw. notifyAll mü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();
	}
}
// ...