Java Concurrency in Practice

von Brian Goetz, Tim Peilers, Joshua Bloch, Joseph Bowbeer, Davod Holmes, Doug Lea

Skalierbare Anwendungen zu schreiben, die die Fähigkeiten der heutigen Multicore-CPUs nutzen und dabei zuverlässig und performant laufen, ist eine Herausforderung. Schnell schleichen sich Race Conditions, Deadlocks und andere Liveness-Fehler ein.

Brian Goetz und ein Team von Experten aus dem Java Specification Request 166 "Concurrency Utilities" beschreiben in “Java Concurrency in Practice” grundlegende Konzepte der Threadsicherheit und die korrekte Implementierung threadsicherer Anwendungen in Java.

Das Buch ist in vier Teile gegliedert:

  1. Im ersten Teil geht es um Grundlagen wie Atomarität und Sichtbarkeit, um intrinsische Locks (“synchronized”), sichere Veröffentlichung von Objekten, threadsichere Komposition und Concurrency-Bausteine wie Concurrent Collections und Synchronizer wie Semaphore, Latches und Barrieren.
  2. Im zweiten Teil geht es um die Parallelisierung von Anwendungen mithilfe von Tasks und dem Executor Framework. Erklärt werden die Konfiguration von Thread Pools und das sichere Beenden von Tasks, Threads, Thread Pools und Anwendungen.
  3. Im dritten Teil geht es um Liveness (Deadlocks, Livelocks, Thread Starvation), um Messung von Performance und deren Verbesserung durch Reduzierung von Lock Contention und um das Schreiben von Tests für nebenläufige Algorithmen.
  4. Im vierten Teil geht es um fortgeschrittene Themen wie explizite Locks, Condition Queues (wait/notify), atomare Variablen, nicht-blockierende Algorithmen und das Java Memory Model. Darauf aufbauend wird die Funktionsweise vieler im ersten Teil vorgestellter Themen, wie Objekt-Veröffentlichung, Concurrent Collections und Synchronizer-Klassen, erläutert.

Die Erklärungen werden von hervorragenden praxisnahen Beispielen begleitet. Die meisten zeigen zuerst häufig gemachte, aber falsche Implementierungen – gefolgt von den richtigen.

Den Autoren gelingt es ein äußerst komplexes Thema auf relativ einfache Weise zu erklären. Besonders hervorzuheben ist die ausgezeichnete Erklärung des Java Memory Models und der “happens-before”-Beziehung.

Dennoch ist das Buch keine einfache Lektüre, und es braucht Zeit, um alle Details zu verstehen. Ich empfehle das Buch mindestens zweimal zu lesen.

Auch wenn das Buch auf dem Stand von Java 6 ist, ist es nach wie vor aktuell. An den Grundlagen der Threadsicherheit hat sich seither nichts geändert, und alle in späteren Java-Versionen hinzugekommenen Features (wie das Fork/Join-Framework, CompletableFuture oder parallele Streams) basieren darauf.

🎧 Geeignet als Hörbuch? Nein, aufgrund zahlreicher umfangreicher Codebeispiele.

P.S.: Wer noch tiefer in die fortgeschrittene Thematik einsteigen möchte, und z. B. über spezifische Arten von Memory Fences und fortgeschrittene Speicherzugriffsmethoden wie Release/Acquire und Opaque lesen möchte, dem empfehle ich als Folgelektüre Doug Leas “Concurrent Programming in Java”.

Andere Empfehlungen aus den Genres dieses Buches

* Hinweis: Wir teilen gerne unsere Lieblingsbücher mit dir! Als Amazon-Partner verdienen wir eine kleine Provision bei Einkäufen, die du über unsere Links tätigst. Dies hilft uns, weiterhin Inhalte zu erstellen, die dir gefallen.