pp.03.03-BoundedQueueAwaitSignal
await
/signal
für Ringpuffer
- Projekt:
pp.03.03-BoundedQueueAwaitSignal
- Bearbeitungszeit: 15 Minuten
- Musterlösung: 15 Minuten
- Kompatibilität: mindestens Java SE 10
Quellcode von pp.BoundedBuffer
Hier wird derselbe Quellcode wie in der vorigen Aufgabe pp03.02-BoundedQueueWaitNotify
verwendet. Die einzige Änderung ist, dass es mit einigen vorbereiteten Instanzvariablen schon einige Vorgaben für die Benutzung von Lock
und Condition
gibt:
final Lock lock = new ReentrantLock();
final Condition notFull = this.lock.newCondition();
final Condition notEmpty = this.lock.newCondition();
Im Projekt pp.03.02-BoundedQueueWaitNotify
wurde derselbe Warteraum (bzw. dieselbe Bedingungsvariable) für zwei unterschiedliche Situationen benutzt:
- Puffer ist leer \(\to\) alle Threads, die
take()
machen wollen, müssen warten - Puffer ist voll \(\to\) alle Threads, die
put()
machen wollen, müssen warten
Diese beiden Bedingungen sind aber inhaltlich unabhängig voneinander. Vom gegenseitigen Ausschluss wegen des konkurrierenden Zugriffs auf dieselbe Variable (mem
) abgesehen, brauchen Threads, die take()
machen wollen, nicht warten, wenn der Puffer voll ist und umgekehrt.
Deshalb sollen nun mit dem Lock
-Interface zwei getrennte Bedingungsvariablen (Condition
) erzeugt werden, die getrennt zum Signalisieren der beiden Situationen benutzt werden sollen.
Aufgabe
- Modifizieren Sie die Methoden
put
undtake
so, dass zwei getrennte Bedingungsvariablen verwendet werden.