4

Ist es sicher, foreach, hinzufügen, entfernen, Größe Operationen in verschiedenen Threads mit dem nächsten Satz durchzuführen?Ist der Satz von ConcurrentHashMap threadsicher in foreach?

private final Set<MyObject> myConcurrentHashSet = ConcurrentHashMap.newKeySet(); 

I.e. Ich brauche nicht maximale Genauigkeit in Foreach- oder Größenoperationen, aber ich muss sicher sein, dass es keine Ausnahmen gibt, während ich foreach/add/remove/size-Operationen mache.

Ich weiß, dass ConcurrentHashMap Thread sicher ist, aber ich bin verwirrt über die Thread-Sicherheit seines Sets.

+0

Mögliche Duplikat [iteriert Werte ConcurrentHashMap Thread-sicher?] (Https://stackoverflow.com/questions/3768554/is-iterating-concurrenthashmap-values-thread-safe) –

+2

@Yogesh_D es ist kein Duplikat Er fragt nach der Set-Ansicht über concurrentHashMap, die nicht gut dokumentiert ist. Das Kommentardokument für newKeysSet() ist sehr schlecht. –

+0

@KrzysztofCichocki "aber ich muss sicher sein, dass es keine Ausnahmen geben wird, während ich foreach/add/remove/size-Operationen mache." aus diesem Grund. –

Antwort

2

Ja, die keySet mit sicherer fädeln, die newKeySet in Java> = 8 dieser Java 7 Form entspricht:

für Java < = 7

ConcurrentHashMap c = ...; 
Set threadSafeSet = c.keySet(); 

für Java> = 8

Set threadSafeSet = ConcurrentHashMap.newKeySet(); 
-2

Von ConcurrentHashMap Dokumentation:

Abrufvorgänge (einschließlich get) im Allgemeinen nicht blockieren, so kann mit Update-Operationen (einschließlich Put und entfernen) überlappen. Retrievals spiegeln die Ergebnisse der zuletzt abgeschlossenen Aktualisierungsoperationen wider, die sich an ihrem Beginn befinden. (Formaler ausgedrückt, eine Aktualisierungsoperation für einen gegebenen Schlüssel trägt eine Vor-Vor-Beziehung mit einem (nicht null) Abruf für diesen Schlüssel, der den aktualisierten Wert meldet.)
. .

ähnlich Iteratoren, Spliterators und Aufzählungen Elemente zurück an oder seit der Gründung von der Iterator/Enumeration den Zustand der Hash-Tabelle zu einem bestimmten Zeitpunkt reflektieren. Sie werfen ConcurrentModificationException nicht. Iteratoren sollen jedoch von nur einem Thread gleichzeitig verwendet werden.

+0

Wenn Sie gewählt haben, die Frage als Duplikat zu schließen, warum antworten Sie darauf? Außerdem wiederholst du einfach, was ich bereits beantwortet habe, und du kopierst einfach die Dokumentation ... –