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 und take so, dass zwei getrennte Bedingungsvariablen verwendet werden.