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:
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
putundtakeso, dass zwei getrennte Bedingungsvariablen verwendet werden.