In diesem Tutorial geht es um das Java Memory Model und den Fork-Join-Pool
(inkl. Ausblick auf "filter/map/reduce for Java" in Java 8).
Multicore-Prozessoren verwenden aufwendige Caching-Mechnismen, um ein
gute Verarbeitsgeschwindigkeit zu erreichen. Diese Caching-Verfahren
haben dazu geführt, dass die Programmiersprachen ihre Anforderungen
an die so-genannte "cache coherence" reduzieren mussten, d.h. es ist keineswegs
garantiert, dass alle Threads in einer Anwendung eine übereinstimmende
Sicht auf die Daten im Speicher haben. Vielmehr können unterschiedliche
Threads zum selben Zeitpunkt unterschiedliche Werte für dieselben
Speicherzellen sehen.
Diese "relaxed cache coherence" hat in Java dazu geführt, dass
mit Java 5 das Speichermodell der Sprache (JMM – Java Memory Model) überarbeitet
und präzisiert wurde. Die Sprachspezifikation definiert Garantien
bzgl. Atomicity, Visibility und Reordering von Speicherzugriffen.
Auf diese Garantieren können sich die Programmierer verlassen; anderseits
muss eine virtuelle Maschine die Sprachgarantieren auf Basis des jeweiligen
Hardware-Memory-Modells implementieren. Für Java-Entwickler
bedeutet es, dass sie die Garantien des Speichermodells kennen müssen,
um korrekte Multithread-Programme schreiben zu können. Die Session
gibt einen Überblick über die Regeln des Java-Speichermodells.
Seit Java 5 wurden Anstrengungen unternommen, die Multithread-Programmierung
in Java durch Standardabstraktionen im JDK zu unterstützen.
Das Package java.util.concurrent liefert eine Reihe von Synchronisationsmechanismen
(wie Lock, Semaphore, Barrier, Latch, Phaser, Queue und Deque). Daneben
gibt es mehrere Threadpool-Implementierungen. Relativ neu ist der
in Java 7 hinzugekommene Fork-Join-Pool, der für die Parallelverarbeitung
von rekursiven, voneinander abhängigen Aufgaben konzipiert ist.
Die Session betrachtet diesen neuen Threadpool näher. Es
wird der Unterschied zum herkömmlichen Thread-Pool erläutert;
es wird Einblick in die Implementierung und Arbeitsweise des Fork-Join-Frameworks
gegeben und seine Verwendung anhand von Beispielen gezeigt. Der Fork.Join-Pool
ist deshalb besonders interessant, weil er eine zentrale Rolle spielt im
Zusammenhang mit der Parallelisierung von Zugriffen auf Sequenzen.
Im Rahmen des Java Enhancement Proposal JEP 107 "Bulk Data Operations for
Collections" (auch als "filter/map/reduce for Java" bekannt) werden für
Java 8 Erweiterungen an den bestehenden Collections im JDK spezifiziert,
damit "bulk operations" in Zukunft automatisch von mehreren Threads parallel
ausgeführt werden.
|