Java-Programmierung auf Multicore-Plattformen - wie Sprache, JDK und JVM die Parallelverarbeitung unterstützen

SPEAKER 1: Angelika Langer COMPANY: Angelika Langer Training/Consulting SPEAKER 2: Klaus Kreft

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.

LEVEL OF TALK: Intermediate LANGUAGE: Talk: de / Slides: en

Anmeldung und weitere Informationen bei jug.ch (Anmeldungen via techup haben nur informellen Charakter)

1 person is attending this meetup

Open in Google Maps