Ist "ConcurrentHashMap.putAll (...)" atomar?

8

Wird die Methode ConcurrentHashMap.putAll (Map) als atomar angesehen?

Ich kann es in der Dokumentation nicht finden und es wird nicht in der ConcurrentMap-Schnittstelle erwähnt, also denke ich, die Antwort ist nein. Ich frage es, um sicher zu sein, da es keinen Sinn ergeben würde, wenn diese Operation nicht atomar wäre, um ehrlich zu sein.

Wenn es nicht atomar ist, was wäre der beste Weg, atomare Einfügungen mehrerer Elemente zu unterstützen? Zurück zum guten alten synchronisiert?

    
Japer D. 14.12.2011, 23:35
quelle

4 Antworten

9

Es ist nicht atomar, nein. Laut der Klassendokumentation :

  

Bei aggregierten Operationen wie putAll und clear können gleichzeitige Abrufe das Einfügen oder Entfernen von nur einigen Einträgen widerspiegeln.

Um es zu atomisieren, müssen Sie synchronized , yes verwenden. Es gibt keine blockierungsfreie Möglichkeit, dies zu tun.

    
ruakh 14.12.2011, 23:40
quelle
3

ganz oben in dem Dokument

  

Für aggregierte Operationen wie putAll und clear , gleichzeitig   Abrufvorgänge können das Einfügen oder Entfernen von nur einigen Einträgen widerspiegeln.

    
ratchet freak 14.12.2011 23:41
quelle
2

putAll() ist nicht atomar, sondern hat lediglich die Garantie, dass jedes einzelne put() atomar ist.

    
eboix 14.12.2011 23:42
quelle
2
  

Um es zu atomisieren, müssen Sie synchronisiert verwenden, ja

Nicht nur das: Sie müssen einen synchronisierten Block um jede öffentliche Kartenmethode legen und so die Nebenläufigkeit verringern.

    
OlliP 16.10.2012 06:57
quelle

Tags und Links