Kurs 20026 Programmierungs-Konzepte

Einsendeaufgaben zu Lerneinheit 4

Auf der Webseite des Kurses finden Sie das Projekt "semaphore", das die Klasse 'Semaphore' durch Java-Monitore implementiert. Die Klasse bietet zwei öffentliche Methoden p() und v(), die dazu dienen, eine private Zählvariable herunter bzw. hoch zu zählen. (Wir erinnern uns, dass beim Aufruf der p()-Methode der Zugang zu dem kritischen Bereich, der durch den Semaphor geschützt wird, blockiert wird, falls die Zählvariable den Wert 0 hat.)

Wir werden diese Klasse zur Lösung von Synchronisationsproblemen verwenden.

Aufgabe 1 (15 Punkte)

Auf der Webseite des Kurses finden Sie das Projekt "aBCs" (es benutzt die Klasse 'Semaphore').

  1. Studieren Sie die Klassen dieses Projekts und setzen Sie in der Klasse Abc die passenden Anfangswerte für die Semaphoren ein, so dass das Programm folgende Bedingungen erfüllt:
    • Die Buchstaben A und B müssen vor dem Buchstaben C ausgedruckt werden.
    • Die Buchstaben B und C müssen abwechselnd in der Ausgabezeichenkette auftreten. D.h. nachdem ein B ausgegeben wurde, kann ein weiteres B erst ausgegeben werden, nachdem ein C gedruckt wurde, und ein weiteres C darf erst erscheinen, nachdem ein B gedruckt wurde.
    • Die Summe der Bs und Cs zu jedem Zeitpunkt darf die Anzahl der ausgegebenen As nicht überschreiten.
  2. Kommentieren Sie die Klassen in verständlicher Weise.
  3. Schicken Sie Ihre Lösung zusammen mit einer Aufzeichnung eines Probelaufs ein.

Aufgabe 2 (15 Punkte)

  1. Benutzen Sie die Methoden der Klasse 'Semaphore' dazu, die Schnittstelle 'BoundedBuffer' des Projekts "boundedBuffer" derart zu implementieren,
    • dass Sie die drei Semaphore
      • emptySlots,
      • occupiedSlots und
      • mutex
      anstelle der Monitorlösung benutzen, um für den Puffer sicher zu stellen, dass
    • ein put()-Aufruf nur ausgeführt wird, wenn noch freie Plätze verfügbar sind,
    • ein get()-Aufruf nur ausgeführt wird, wenn der Puffer besetzte Plätze aufweist und
    • die Variable 'count' nur im wechselseitigen Ausschluss verändert werden darf.
    Sie können die Klassen 'Producer', 'Consumer' und 'ProducerConsumerInteraction' wiederverwenden.
  2. Zeichnen Sie einen Ablauf des Systems auf, in dem die Erfüllung der o.g. Eigenschaften dokumentiert ist, und geben Sie an, mit welchen Anfangsparametern Ihr Programm gestartet werden muss, um diesen Ablauf zu beobachten.