Intuitiv ein ConcurrentHashMap sollte wie eine Reihe von flüchtigen Variablen verhalten; Kartenschlüssel sind die Variablenadressen. get(key)
und put(key, value)
sollten sich wie flüchtiges Lesen und Schreiben verhalten.
Das ist nicht explizit in dem Dokument angegeben. Ich bin jedoch der festen Überzeugung, dass dies der Fall ist. Andernfalls wird es viele unerwartete, überraschende Verhaltensweisen geben, die die Anwendungslogik unterminieren. Ich glaube nicht, dass Doug Lea uns das antun würde. Um sicher zu sein, fragen Sie ihn bitte auf concurrency-interest
Mailing-Liste.
Angenommen es die flüchtige Semantik nicht gehorcht, können wir auf Basis von Java-Speichermodell Reason -
Alle flüchtig liest und schreibt einen einzigen Gesamtauftrag bilden. Dies kann als eine Pseudo-Zeitlinie betrachtet werden, bei der Lese-/Schreibvorgänge Punkte sind.
Ein flüchtiges Lesen sieht die sofortige volatil vorhergehenden Schreib, und sieht nur den Schreib. "Preceding" entspricht hier der Pseudo-Zeitlinie.
Die Pseudozeitlinie kann von „real“ Zeitlinie abweichen. Theoretisch kann ein flüchtiger Schreibvorgang jedoch nicht unendlich auf die Pseudo-Zeitlinie verschoben werden. Und in der Praxis sind zwei Zeitlinien ziemlich nah.
Deshalb können wir ziemlich sicher sein, dass ein flüchtiger Schreib sichtbar „sehr schnell“ werden sollte liest.
Wie planen Sie, die Daten zu lesen? –
mit einfachen get() –
Dann sollten Sie sich keine Sorgen machen, wird es den genauesten Wert zurückgeben. –