2016-11-29 18 views
2

私はConcurrentHashMap<String, Object> concurrentMap;concurrentMap.keySet()。toArray()はスレッドセーフですか?

マップのキーでString []を返す必要があります。

は、次のコードです:

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

、スレッドセーフ?

+0

この記事はあなたにとって興味深いかもしれません。http://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/ – thoeni

+0

'String []'へのキャストも間違っています。 – user2357112

答えて

2

YesとNo Threasセーフのみfuzzilyのように定義されますあなたが範囲にまで広がるとすぐに。

一般に、並行収集は、複数のスレッドによる同時アクセスを許可する方法で、またはそうでない場合、そのようなアクセス(たとえば、同期)を透過的にシリアル化するメカニズムを提供します。したがって、有効な内部構造とメソッド呼び出しを保持するという意味では安全です。有効な結果が得られます。

詳細を見ると、ぼやけが始まります。 toArray()はコレクションのコンテンツのスナップショットを返します。メソッドが返すまでに、内容が既に変更されているという保証はありません。したがって、呼び出しがスレッドセーフである間に、結果はでなく、は通常の不変条件を満たすことはありません(たとえば、配列の内容はではなく、と同じです)。

同時収集に対するmupltiple呼び出しの範囲に一貫性が必要な場合は、必要な整合性を確保するためにメソッドを呼び出すコード内にメカニズムを提供する必要があります。

3

ConcurrentHashMapはスレッドセーフなクラスですが、キーに使用されているIteratorは、一度作成した任意のその後HashMap変更、...

と同期する ませCERTAINです 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. 
関連する問題