この例でのConcurrentHashMapとHashMapの行動の違いに混乱

e2rabi:

私はConcurrentHashMapの仕組みを理解しようとしています。私は例を見つけましたが、私はそれを理解することはできませんよ。ここではそのコードは次のとおりです。

Map<String, Object> myData = new HashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for (String key : myData.keySet()) {
    myData.remove(key);
}

これは、例外がスローされますConcurrentModificationException実行時。

しかし、使用して、このコードはConcurrentHashMap正しく動作します:

Map<String, Object> myData = new ConcurrentHashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for (String key : myData.keySet()) }
    myData.remove(key);
}

誰かがConcurrentHashMapのは、HashMapのが例外をスローしながら、キーを削除することができますなぜ私に説明できますか?感謝

マシューTimmermans:

それはちょうどの特徴の一つですConcurrentHashMapドキュメントから引用します。

反復子/列挙の作成時または以降のある時点で、ハッシュテーブルの状態を反映同様、イテレータ、Spliteratorsと列挙リターン要素。彼らはConcurrentModificationExceptionをスローしません。

ConcurrentHashMap本当にしかし、あなたのユースケースをサポートするために、これを行いません。反復が1つのスレッドで他のスレッドで行われた変更と同時に起こることを可能にするために行われます。

これは、使用のためのあなたの唯一の理由である場合ConcurrentHashMap、それはより多くの高価であるため、あなたはおそらく、再考する必要がありますHashMapあなたはこのようにそれを使用する前に、キーセットのコピーを作成したほうが良いです。

Map<String, Object> myData = new HashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for(String key: myData.keySet().toArray(new String[0]))
    myData.remove(key); 

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=199821&siteId=1