05.08.2013 Aufrufe

Cornelia Heinisch, Frank Müller-Hofmann, Joachim Goll ... - HSR-Wiki

Cornelia Heinisch, Frank Müller-Hofmann, Joachim Goll ... - HSR-Wiki

Cornelia Heinisch, Frank Müller-Hofmann, Joachim Goll ... - HSR-Wiki

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Threads 747<br />

In objektorientierten Programmiersprachen lässt sich ein Monitor als ein Objekt mit<br />

speziellen Eigenschaften für die Methoden realisieren.<br />

Einfache kritische Abschnitte reichen aus für einen wechselseitigen Ausschluss.<br />

Oftmals jedoch ist das Betreten eines kritischen Abschnitts abhängig vom Vorliegen<br />

einer bestimmten Bedingung. So kann etwa ein Erzeuger-Prozess nur dann in einen<br />

Puffer, der eine globale Variable darstellt, schreiben, wenn der Puffer nicht voll ist. Ist<br />

der Puffer voll, so muss der Erzeuger-Prozess mit dem Schreiben warten.<br />

Um einen Monitor praktikabel zu machen, muss also ein Monitor die Möglichkeit<br />

bedingter kritischer Abschnitte (conditional critical sections) bieten, damit ein<br />

Prozess beim Betreten eines kritischen Abschnitts prüfen kann, ob er diesen kritischen<br />

Abschnitt ausführen soll oder nicht. Auf Grund einer vorliegenden Bedingung<br />

kann ein Prozess freiwillig die Abarbeitung einer Methode unterbrechen, z.B. wenn<br />

die Bedingung "Daten vorhanden" nicht erfüllt ist. Ein Prozess kann seine Arbeit<br />

unterbrechen, indem er einen wait()-Befehl an den Monitor gibt. Damit wird dieser<br />

Prozess blockiert und der Monitor für einen anderen Prozess freigegeben. Ein<br />

anderer Prozess kann dann den Monitor betreten – z.B. ein Schreibprozess –, die<br />

Bedingung ändern und vor dem Verlassen des kritischen Abschnitts ein Signal mit<br />

dem signal()-Befehl an die Warteschlange der Prozesse senden, die auf die<br />

Erfüllung der Bedingung "Daten vorhanden" warten. Durch das Senden eines signal()-Befehls<br />

wird ein Prozess aus der Warteschlange aufgeweckt und kann die<br />

Bearbeitung fortsetzen.<br />

19.5.4 Mutual exclusion in Java mit dem Monitorkonzept<br />

Ein wechselseitiger Ausschluss wird in Java mit dem Monitorkonzept und nicht mit<br />

Semaphoren realisiert. In Java wird das Monitorkonzept mit Hilfe des Schlüsselwortes<br />

synchronized umgesetzt. Das Schlüsselwort synchronized kann als<br />

Schlüsselwort für Methoden verwendet werden oder einen zu synchronisierenden<br />

Block kennzeichnen. Im Folgenden werden die Möglichkeiten zur Realisierung eines<br />

Monitors vorgestellt:<br />

• Monitor für den gegenseitigen Ausschluss von synchronisierten Klassenmethoden<br />

einer Klasse.<br />

Werden eine oder mehrere Klassenmethoden mit dem Schlüsselwort<br />

synchronized versehen, so wird ein Monitor um diese<br />

Methoden herumgebaut. Dadurch kann nur ein einziger Thread<br />

zu einer bestimmten Zeit eine der synchronisierten Methoden<br />

bearbeiten.<br />

Der folgende Codeausschnitt zeigt zwei synchronisierte Klassenmethoden:<br />

public class Syn1<br />

{<br />

. . . . .<br />

public static synchronized void methode1()<br />

{<br />

// kritischer Abschnitt<br />

}

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!