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);