2016-11-29 4 views
2

Ich habe eine ConcurrentHashMap<String, Object> concurrentMap;Ist concurrentMap.keySet(). ToArray() threadsicher?

Ich muss String [] mit Schlüsseln der Karte zurückgeben.

Ist der folgende Code:

public String[] listKeys() { 
    return (String[]) concurrentMap.keySet().toArray(); 
    } 

Thread-sicher?

+0

Vielleicht kann dieser Artikel für Sie interessant sein: http://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/ – thoeni

+0

Beachten Sie, dass die Cast in 'String []' ist auch falsch. – user2357112

Antwort

2

Ja und Nein Threas sicher nur unscharf definiert als sobald Sie den Umfang erweitern. Im Allgemeinen implementieren gleichzeitige Sammlungen alle ihre Methoden in einer Weise, die einen gleichzeitigen Zugriff durch mehrere Threads ermöglichen, oder, wenn sie nicht können, Mechanismen bereitstellen, um solche Zugriffe (z. B. Synchronisation) transparent zu serialisieren. Daher sind sie sicher in dem Sinne, dass sie sicherstellen, dass sie eine gültige interne Struktur beibehalten und Methodenaufrufe gültige Ergebnisse liefern.

Die Unschärfe beginnt, wenn Sie sich die Details anschauen, z. toArray() wird Ihnen eine Art von Snapshot des Inhalts der Sammlungen zurückgeben. Es gibt keine Garantie dafür, dass der Inhalt zum Zeitpunkt der Rückgabe der Methode nicht bereits geändert wurde. Während also der Aufruf threadsicher ist, wird das Ergebnis nicht die üblichen Invarianten erfüllen (z. B. kann der Array-Inhalt nicht den Sammlungen entsprechen).

Wenn Konsistenz über den Umfang der Aufrufe einer parallelen Sammlung erforderlich ist, müssen Mechanismen innerhalb des Codes bereitgestellt werden, die die Methoden aufrufen, um die erforderliche Konsistenz zu gewährleisten.

3

Während der ConcurrentHashMap eine Thread-sichere Klasse ist, die Iterator, die auf den Tasten verwendet wird, ist NICHT SICHER mit allen nachfolgenden HashMap Änderungen synchron zu sein, einmal erstellt ...

Vom spec:

public Set<K> keySet() 

    Returns a Set view of the keys contained in this map...... 
    ........................... 

    The view's iterator is a "weakly consistent" iterator that will 
    never throw ConcurrentModificationException, and guarantees to 
    traverse elements as they existed upon construction of the iterator, 
    and may (but is not guaranteed to) reflect any modifications 
    subsequent to construction.