Synchronisation von Threads dient der Sicherstellung des gegenseitigen Ausschlusses beim Zugriff auf gemeinsam benutzte Daten.
Java bietet zwei Konstrukte
Wird eine als synchronized markierte Methode für ein Objekt aufgerufen, so gilt dieses Objekt als gesperrt (locked).
Alle anderen Threads, die ebenfalls eine synchronisierte Methode für dieses Objekt aufrufen, werden blockiert, bis diese Sperre aufgehoben ist.
So läßt sich gegenseitiger Ausschluß beim Zugriff auf Daten sicherstellen.
Die Java-Synchronisation beruht auf Monitoren (Hoare, 1974)
(siehe Seite ). Es gibt allerdings keine
expliziten lock- und unlock-Operationen.
class Konto { private double Kontostand; public Konto(double anf) { Kontostand = anf; } public synchronized double getKontostand() { return Kontostand; } public synchronized void setKontostand(double d) { Kontostand = d; } public synchronized void einzahlen(double b) { double a = getKontostand(); a += b; setKontostand(a); } }
Synchronisierte Klassenmethoden
synchronized-Markierung geht auch bei Klassenmethoden :
Überschreiben von synchronisierten Methoden
Eine Methode, die eine synchronisierte Methode überschreibt, kann entweder synchronisiert oder nicht synchronisiert sein.
Die Eigenschaft der überschriebenen Methode, Objekte zu sperren, geht durch die nicht synchronisierte überschreibende Methode nicht verloren.
class ober { synchonized void method() { ... } ... } class unter extends ober { void method() { super.method(); // jetzt sperren ... } ... }
Synchronisierte Anweisungen dienen dazu, bezüglich Objekten zu synchronisieren auch wenn keine synchronisierten Methoden vorhanden sind.
Form:
synchronized(expr) statement
Bedeutung:
Wenn der Thread die Sperre für das Objekt expr erhält, kann die Anweisung statement ausgeführt werden.
// numbs soll nach der folgenden // Schleife Absolutwerte enthalten synchronized (numbs) { for (int i = 0; i < arr.length; i++) if (numbs[i] < 0) numbs[i] = -numbs[i]; }
Die Sperren, die zur Realisierung synchronisierter Anweisungen verwendet werden, sind die gleichen wie für synchronisierte Methoden.
Die beiden Synchronisations-Schreibweisen von Java können also zusammenarbeiten.