In Java gibt es zwei Möglichkeiten einen kritischen Abschnitt zu schützen. Mit
Wird das Wort synchronized in der Modifierliste einer Methodendeklaration angegeben, so wird das Objekt während der Abarbeitung der Methode geschützt. Das heisst, solange irgend ein Thread gerade diese Methode ausführt, können keine anderen Threads auf das Objekt zu dem die Methode gehört (this) zugreifen. Beispiel:
public class Konto { private float Stand; // Betrag ist von aussen nicht direkt // manipulierbar public float Kontostand() { // Nur lesender Zugriff, return Stand; // muss nicht geschuetzt werden } public synchronized void Einzahlung(float Betrag){ Stand = Stand + Betrag; } public synchronized void Auszahlung(float Betrag) { Stand = Stand - Betrag; } }
Sobald ein Thread die Methode Einzahlung oder Auszahlung eines Konto-Objektes aufruft, wird dieses Objekt für den Zugriff von anderen Threads gesperrt. Das bedeutet, dass ein anderer Thread keine der Methoden dieses Objektes mehr aufrufen kann. Beachten Sie, das der Schutzmechanismus auf Objekte und nicht auf Klassen funktioniert. So kann die Methode Einzahlung sehr wohl gleichzeitig für verschiedene Objekte ablaufen, d.h. es können mehrere Einzahlungen gleichzeitig geschehen, solange sie nicht dasselbe Konto betreffen.
Mit der synchronized Anweisung kann ein bestimmtes Objekt in einem kritischen Abschnitt gesperrt werden.
synchronized ( Objekt ) Block
Das angegebene Objekt wird während der Ausführung des Blockes gesperrt, so dass kein anderer Thread gleichzeitig den Block abarbeiten kann. Ein Beispiel:
public class Geldautomat { public void Abheben(Konto von, float betrag) { boolean ok; synchronized (von) { ok = (von.Kontostand() > betrag); // der Betrag muss vorhanden sein, if ( ok ) { von.Auszahlung(betrag); // dann kann eine Auszahlung erfolgen } } if (ok) { // Herausgeben des Geldes (dies kann ev. lange dauern) } } }
Der kritische Abschnitt der Methode Abheben bildet den Block der synchronized Anweisung. Während ein Thread die Anweisungen dieses Blocks abarbeitet, können andere Threads nicht mehr auf das Objekt von zugreifen; das heisst auch keine Methoden des Objekts von aufrufen.
Kritische Abschnitte - Synchronisation in Java - Tips und Hinweise - Lösungsmöglichkeit
OOP - Werkzeuge - Referenzen - Fäden - Synchronisation - Applets - Dokumentation
Werkstatt - Bibliographie