next up previous contents index
Next: Synchronisation von Threads mit Up: Parallelausführung Previous: Zustand eines Threads

Synchronisation von Threads über Daten

  Synchronisation von Threads dient der Sicherstellung des gegenseitigen Ausschlusses beim Zugriff auf gemeinsam benutzte Daten.

Java bietet zwei Konstrukte

Synchronisierte Methoden

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 gif). 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

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.


next up previous contents index
Next: Synchronisation von Threads mit Up: Parallelausführung Previous: Zustand eines Threads

Peter Pfahler, 1997