Java Concurrency in Practice
Rezension von Sven Woltmann
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:
- 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. - 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.
- 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.
- 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
Effective Java: Best Practices für die Java-Plattform
Java Puzzlers: Traps, Pitfalls, and Corner Cases
Concurrent Programming in Java: Design Principles and Pattern, 2nd Edition
Java Generics and Collections
Core Java: Fundamentals (Volume 1)
Core Java: Advanced Features (Volume 2)
Mastering Lambdas: Java Programming in a Multicore World
Spring Boot 3: So geht moderne Java-Entwicklung – Konzepte und Anwendungen
Get Your Hands Dirty on Clean Architecture: A hands-on guide to creating clean web applications with code examples in Java
Der pragmatische Programmierer: Ihr Weg zur Meisterschaft
Clean Code – Refactoring, Patterns, Testen und Techniken für sauberen Code
Refactoring: Wie Sie das Design bestehender Software verbessern
Clean Craftsmanship: Best Practices, Standards und Ethik für die Softwareentwicklung
The Programmer’s Brain: What Every Programmer Needs to Know About Cognition
Effektives Arbeiten mit Legacy Code. Refactoring und Testen bestehender Software