© DrHitch/Shutterstock.com
Shortcuts
Java 7

3 Thread-Synchronisation mithilfe des Phasers

Nun wollen wir uns den Phaser ansehen. Dabei geht es nicht um jene galaktische Strahlenkanone, mit der sich die Star-Trek-Helden verteidigt haben, sondern um einen Synchronizer im JDK Package java.util.concurrent, der so heißt, weil er in Phasen abläuft. Er hat ähnliche Eigenschaften wie die bereits seit Längerem existierenden Synchronisationsmittel CountDownLatch und CyclicBarrier, ist aber deutlich flexibler.

Shortcut Autorenteam


Der Phaser ist ebenso wie das CountDownLatch und die CyclicBarrier eine der Abstraktionen aus dem JDK, die die Synchronisation von Threads unterstützen. Allen drei Abstraktionen ist gemeinsam, dass sie ein so genanntes Thread-Rendezvous implementieren. Das Thread-Rendezvous-Pattern beschreibt das Treffen von zwei oder mehr Threads, die zusammenkommen, um sich zu synchronisieren, Daten auszutauschen oder ihre Aktionen miteinander zu koordinieren. Dabei unterscheidet man zwischen waiting-, timed- und balking-Rendezvous, je nachdem, ob die am Treffpunkt ankommenden Threads beliebig lange aufeinander warten (waiting), nach einer gewissen Wartezeit den Treffpunkt verlassen (timed) oder sofort weggehen, wenn der oder die anderen Threads nicht schon da sind (balking). Ein Beispiel für ein wartendes Rendezvous wäre das Treffen mehrerer Worker Threads, die darauf warten, dass ein anderer Thread alle erforderlichen Vorbereitungen erledigt und dann zum Treffpunkt kommt, ehe die Worker Threads mit ihrer Arbeit beginnen; die Ankunft des vorbereitenden Threads ist dann eine Art Startsignal. Hinter allen Rendezvousimplementierungen steckt in der Regel ein Zähler (z. B. für die schon angekommenen oder die noch am Treffpunkt erwarteten Threads), der auf- oder abwärts zählt, bis er einen Schwellenwert erreicht. Dann wird ein Ereignis ausgelöst, auf das man warten oder das man abfragen kann. 3.1 Die traditionellen Synchronizer CyclicBarrier und CountDownLatchBeim CountDownLatch ist die Verwendung eines Zählers am offensichtlichsten: Ein CountDownLatch wird konstruiert, indem man einen Anfangswert N > 0 angibt. Mit der Methode countDown() wird bei jedem Aufruf der Zähler dekrementiert. Mit der Methode await() kann man darauf warten, dass der Zähler endlich den Wert 0 erreicht. Diesen einfachen Countdownmechanismus kann man sehr bequem für Start- und Endesignale verwenden. Wenn zum Beispiel ein Thread Vorbereitungen machen soll, ehe n andere Threads mit ihrer Arbeit beginnen können, so kann man mit einem CountDownLatch (1) ein Startsignal geben. Die n Worker Threads würden am CountDownLatch warten, bis der Zähler herunter gezählt wird, ehe sie mit ihrer eigentlichen Arbeit beginnen. Der vorbereitende Thread würde nach Beendigung der Vorbereitungen den Countdown machen und damit die wartenden Worker Threads aufwecken. Ganz ähnlich kann man ein Endesignal geben. Dazu würde man ein CountDownLatch(n) verwenden, wobei n die Zahl der Worker Threads ist, auf deren Ergebnis man war...

Shortcuts
Java 7

3 Thread-Synchronisation mithilfe des Phasers

Nun wollen wir uns den Phaser ansehen. Dabei geht es nicht um jene galaktische Strahlenkanone, mit der sich die Star-Trek-Helden verteidigt haben, sondern um einen Synchronizer im JDK Package java.util.concurrent, der so heißt, weil er in Phasen abläuft. Er hat ähnliche Eigenschaften wie die bereits seit Längerem existierenden Synchronisationsmittel CountDownLatch und CyclicBarrier, ist aber deutlich flexibler.

Shortcut Autorenteam


Der Phaser ist ebenso wie das CountDownLatch und die CyclicBarrier eine der Abstraktionen aus dem JDK, die die Synchronisation von Threads unterstützen. Allen drei Abstraktionen ist gemeinsam, dass sie ein so genanntes Thread-Rendezvous implementieren. Das Thread-Rendezvous-Pattern beschreibt das Treffen von zwei oder mehr Threads, die zusammenkommen, um sich zu synchronisieren, Daten auszutauschen oder ihre Aktionen miteinander zu koordinieren. Dabei unterscheidet man zwischen waiting-, timed- und balking-Rendezvous, je nachdem, ob die am Treffpunkt ankommenden Threads beliebig lange aufeinander warten (waiting), nach einer gewissen Wartezeit den Treffpunkt verlassen (timed) oder sofort weggehen, wenn der oder die anderen Threads nicht schon da sind (balking). Ein Beispiel für ein wartendes Rendezvous wäre das Treffen mehrerer Worker Threads, die darauf warten, dass ein anderer Thread alle erforderlichen Vorbereitungen erledigt und dann zum Treffpunkt kommt, ehe die Worker Threads mit ihrer Arbeit beginnen; die Ankunft des vorbereitenden Threads ist dann eine Art Startsignal. Hinter allen Rendezvousimplementierungen steckt in der Regel ein Zähler (z. B. für die schon angekommenen oder die noch am Treffpunkt erwarteten Threads), der auf- oder abwärts zählt, bis er einen Schwellenwert erreicht. Dann wird ein Ereignis ausgelöst, auf das man warten oder das man abfragen kann. 3.1 Die traditionellen Synchronizer CyclicBarrier und CountDownLatchBeim CountDownLatch ist die Verwendung eines Zählers am offensichtlichsten: Ein CountDownLatch wird konstruiert, indem man einen Anfangswert N > 0 angibt. Mit der Methode countDown() wird bei jedem Aufruf der Zähler dekrementiert. Mit der Methode await() kann man darauf warten, dass der Zähler endlich den Wert 0 erreicht. Diesen einfachen Countdownmechanismus kann man sehr bequem für Start- und Endesignale verwenden. Wenn zum Beispiel ein Thread Vorbereitungen machen soll, ehe n andere Threads mit ihrer Arbeit beginnen können, so kann man mit einem CountDownLatch (1) ein Startsignal geben. Die n Worker Threads würden am CountDownLatch warten, bis der Zähler herunter gezählt wird, ehe sie mit ihrer eigentlichen Arbeit beginnen. Der vorbereitende Thread würde nach Beendigung der Vorbereitungen den Countdown machen und damit die wartenden Worker Threads aufwecken. Ganz ähnlich kann man ein Endesignal geben. Dazu würde man ein CountDownLatch(n) verwenden, wobei n die Zahl der Worker Threads ist, auf deren Ergebnis man war...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang