Ändert der Wert einer Map eine atomare Operation?

8

Ich habe mich gefragt, ob die Synchronisation oder die Verwendung einer gleichzeitigen Klasse erforderlich ist, oder umgekehrt ist es threadsicher, eine nicht gleichzeitige Klasse zu verwenden und keine Synchronisation in einer Map in einer Multithread-Umgebung durchzuführen, wenn sich die einzige Änderung an der Map ändert die Werte der Karte.

Der Grund, warum ich das frage, ist die HashMap (und andere nicht gleichzeitige Maps-Dokumentation) mit folgendem Kommentar:

  

Beachten Sie, dass diese Implementierung nicht synchronisiert ist.   Wenn mehrere Threads gleichzeitig auf eine Hash-Map zugreifen, und mindestens eine davon   Die Threads modifizieren die Map strukturell, das muss sein   extern synchronisiert. (Eine strukturelle Änderung ist jede Operation   das Hinzufügen oder Löschen von einer oder mehreren Zuordnungen; nur den Wert ändern   mit einem Schlüssel verknüpft, den eine Instanz bereits enthält, ist kein   strukturelle Modifikation.) Dies wird typischerweise erreicht durch   Synchronisierung auf einem Objekt, das die Karte natürlich kapselt.

Was mich glauben lässt, dass wenn die Modifikation nicht strukturell ist (d. h. Es wurde nicht hinzugefügt oder gelöscht), sollte ich in der Lage sein, die (nicht gleichzeitige) Karte ohne Synchronisation zu aktualisieren.

Lese ich das richtig? Ist die Aktualisierung eines Wertes in einer Karte ein atomarer Prozess?

    
Olivier Twist 11.03.2012, 21:23
quelle

3 Antworten

5

Das Aktualisieren eines Kartenwerts ist kein atomarer Prozess. Wenn jedoch mehrere unterschiedliche Threads versuchen, die Map-Werte gleichzeitig zu ändern, führt dies nicht zu sehr seltsamen Ausnahmen oder Fehlern aufgrund von Parallelitätsfehlern. Beispielsweise werden Sie nicht veranlassen, dass eines der Schlüssel / Wert-Paare verschwindet oder zufällige Elemente aus der Map entfernt.

Die von einem Thread beim Aktualisieren eines Schlüssel / Wert-Paares vorgenommenen Aktualisierungen sind jedoch für andere Threads nicht unbedingt sichtbar, es sei denn, es wird eine andere Synchronisierung ausgeführt (z. B. wenn die Werte AtomicIntegers sind). Darüber hinaus gibt es keine Garantie dafür, dass der Thread sogar seine eigenen Updates sehen wird, da sie möglicherweise von einem anderen Thread geplagt werden.

Hoffe, das hilft!

    
templatetypedef 11.03.2012, 21:27
quelle
2

Etwas in HashMap einzufügen ist keine atomare Operation:

%Vor%

Es kann sich lohnen, Ihre HashMap mit Collections#synchronizedMap .

    
Jeffrey 11.03.2012 21:29
quelle
2

Implementierungen von Maps wie HashMap , TreeMap usw. sind nicht atomar und threadsicher, wenn es um Updates geht. Sie können jedoch atomare Aktualisierungsoperationen ausführen, wenn Sie ein ConcurrentHashMap seit Java 1.8.

Die folgende Methode fügt beispielsweise den Wert für einen bestimmten Schlüssel hinzu oder legt den Wert fest, wenn für den Schlüssel kein vorheriger Wert verfügbar war.

%Vor%     
Kenny Colliander Nordin 09.03.2017 19:48
quelle