私はConcurrentHashMap<String, Object> concurrentMap;
concurrentMap.keySet()。toArray()はスレッドセーフですか?
マップのキーでString []を返す必要があります。
は、次のコードです:
public String[] listKeys() {
return (String[]) concurrentMap.keySet().toArray();
}
、スレッドセーフ?
私はConcurrentHashMap<String, Object> concurrentMap;
concurrentMap.keySet()。toArray()はスレッドセーフですか?
マップのキーでString []を返す必要があります。
は、次のコードです:
public String[] listKeys() {
return (String[]) concurrentMap.keySet().toArray();
}
、スレッドセーフ?
YesとNo Threasセーフのみfuzzilyのように定義されますあなたが範囲にまで広がるとすぐに。
一般に、並行収集は、複数のスレッドによる同時アクセスを許可する方法で、またはそうでない場合、そのようなアクセス(たとえば、同期)を透過的にシリアル化するメカニズムを提供します。したがって、有効な内部構造とメソッド呼び出しを保持するという意味では安全です。有効な結果が得られます。
詳細を見ると、ぼやけが始まります。 toArray()はコレクションのコンテンツのスナップショットを返します。メソッドが返すまでに、内容が既に変更されているという保証はありません。したがって、呼び出しがスレッドセーフである間に、結果はでなく、は通常の不変条件を満たすことはありません(たとえば、配列の内容はではなく、と同じです)。
同時収集に対するmupltiple呼び出しの範囲に一貫性が必要な場合は、必要な整合性を確保するためにメソッドを呼び出すコード内にメカニズムを提供する必要があります。
ConcurrentHashMap
はスレッドセーフなクラスですが、キーに使用されているIterator
は、一度作成した任意のその後HashMap
変更、...
:
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.
この記事はあなたにとって興味深いかもしれません。http://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/ – thoeni
'String []'へのキャストも間違っています。 – user2357112