Unter der Haube der JVM

Das Java Speichermodell in nebenläufigen Programmen

Christian Iwanzik

Playlists: 'froscon2018' videos starting here / audio / related events

Nebenläufigkeiten bereiten bis heute vielen Entwicklern Unbehagen. Ein grundlegendes Wissen der Speicherabläufe während des Programmlaufs helfen hier aber ein besseres und sicheres Programmieren im nebenläufigen Umfeld zu gewährleisten. Exemplarisch wird dies mit Java auf der JVM erklärt.

Seit sich Multicore-Prozessoren immer mehr verbreiten haben, hat auch das Augenmerk auf die nebenläufige Programmierung ebenfalls stark zugenommen. Und nicht erst seit der neuen Concurrency API in Java 8 oder der Reactive Streams Bibliotheken bietet Java die Möglichkeit der nebenläufigen Programmierung.

Nebenläufigkeit ist dabei aber nicht immer intuitiv und gemeinsam genutzte Ressourcen sind nicht auf den ersten Blick ersichtlich. Hier lauern selbst mit modernen Konstrukten wie Threadpools, Futures und Promises immer die Gefahr der Race Conditions, Dead Locks und Starvation. Fehler, welche meist erst nach einiger Zeit in Produktion und bei entsprechender Last auftreten und das Finden und Beheben zu einer stundenlangen Tortour ausarten lassen.

Es hilft daher Fallstricke und mögliche Fehlerfälle von Nebenläufigkeiten im Vorfeld zu kennen und zu vermeiden. Hierbei kann einem ein grundlegendes Verständnis von Speichermodellen und deren Abläufen helfen, wobei Java hier mit dem Java Memory Modell eine Abstraktion über die vielfältigen Rechnerachitekturen bietet.
Der Talk gibt zunächst einen Einblick in das Java Memory Modell als Abstraktion und die grundlegenden Funktionsweisen eines Speichermodells im parallelen Betrieb. Es werden die Operationen 'flush' und 'pull' eingeführt, womit einzelne Threads ihren lokalen Cache mit dem Hauptspeicher synchronisieren.

Mit Beispielen wird gezeigt, wie die Probleme der Atomicity, des Reordering und der Sequential Consistency durch die Mechanismen des Speichermodells auftreten können und welche Implikationen dies im Betrieb hat.

Im Anschluss werden Patterns gezeigt, womit einige dieser Probleme vermieden werden können. Wo Patterns nicht greifen, werden die Javamechanismen 'final Variablen', „volatile Variablen“ und „sychronize“ gezeigt und welchen Einfluss diese Mechanismen auf das Speichermodell haben. Zum Schluss wird ein kleiner Auszug aus der Concurrency Library gezeigt, welche die Patterns und auch die spracheigenene Mechanismen unterstützen.

Download

Related

Embed

Share:

Tags