volatile garantiert Sichtbarkeit und Ordnung: ein Write wird von jedem Thread gesehen, der das Feld danach liest, und es etabliert eine Happens-before-Kante, sodass auch die Writes davor sichtbar sind. Atomarität gibt es nicht, count plus plus bleibt also ein Race, weil es ein Read, ein Add und ein Write ist. Für zusammengesetzte Aktionen nimmst du synchronized, ein Lock oder eine Atomic-Klasse wie AtomicLong.
Warum Interviewer das fragen
Das ist der sauberste Weg herauszufinden, ob jemand das Java Memory Model versteht oder nur weiß, dass volatile irgendwas mit geteilt zu tun hat. Der Interviewer will die Unterscheidung zwischen Sichtbarkeit und Atomarität präzise formuliert hören, dazu einen validen Anwendungsfall wie ein Stop-Flag. Nachfragen gehen gern zu Double-Checked Locking, den Atomic-Klassen und dazu, wie synchronized sowohl gegenseitigen Ausschluss als auch dieselben Speichereffekte liefert.
So baust du deine Antwort auf
- Teil die Garantie in Sichtbarkeit und Ordnung auf.
- Sag klar, was es nicht leistet: zusammengesetzte Operationen bleiben Races.
- Gib einen legitimen Einsatz an, etwa ein Flag, das eine Schleife stoppt.
- Nenn, was du stattdessen nimmst, wenn du Atomarität brauchst.
Beispielantwort
volatile bedeutet, dass ein Read immer den aktuellsten Write sieht statt eines Werts, der in einem Register oder im Cache eines Kerns liegt, und es verhindert, dass Compiler und Prozessor darüber hinweg umordnen. In der Sprache des Memory Models heißt das, es erzeugt eine Happens-before-Kante, alles, was der schreibende Thread davor getan hat, ist also für einen Thread sichtbar, der danach liest. Was es mir nicht gibt, ist Atomarität. Ein Counter-Increment sind drei Operationen, zwei Threads können also denselben Wert lesen und ein Update geht verloren, egal wie volatile das Feld ist. Mein üblicher valider Einsatz ist ein Boolean-Flag, das einer Hintergrundschleife sagt, dass sie stoppen soll, genau ein Write und ein Read, genau das Muster. Alles, was read-modify-write ist, geht an ein AtomicInteger, an einen LongAdder, wenn es heiß genug ist, dass Contention zählt, oder an ein Lock, wenn sich mehrere Felder zusammen ändern müssen. Die andere Stelle, an der ich mich auf das Memory Model verlasse, ist Safe Publication, denn finale Felder sind nach der Konstruktion garantiert sichtbar, was ein guter Grund ist, Dinge immutable zu machen.
Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.
So funktioniert esNachfragen, mit denen du rechnen solltest
- Warum war Double-Checked Locking kaputt, bevor volatile repariert wurde?
- Wie gibt dir synchronized dieselben Speichergarantien?
- Wann würdest du LongAdder statt AtomicLong nehmen?
Weitere Fragen für Java-Entwickler
Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.
Meine Fragen vorhersagen