1

クラスに2つのメソッドがwriteToMap()ありprocessKey()、両方のメソッドが複数のスレッドによって呼び出されているとします。writeToMapはハッシュマップに何かを書くためのメソッドであり、のにprocessKey()基づいてsthを実行するために使用されます。keySetHashMap

processKey内でoriginalMap、キーセットを取得する前に最初にコピーします。

new HashMap<String, Map<String,String>(originalMap).get("xx").keySet();

しかし、私はConcurrentModificationException常にハッシュマップをコピーしているにもかかわらず、まだ取得しています。どうしたの?

4

2 に答える 2

3

HashMapのコピーコンストラクターは、コピーされているマップ(originalMap)に対して(非表示の)反復を実行します。この反復の進行中にoriginalMapが別のスレッドによって変更されると、ConcurrentModificationExceptionが発生する可能性があります。

于 2012-12-13T05:56:21.487 に答える
2

ネストされたマップがあり、内側のマップを取得する前に、外側のマップをコピーしています。内部マップはコピーされていないため、繰り返し処理する場合でも、共有データ構造を使用していることに注意してください。

短いコードスニペットに基づいて言うのは難しいですが、外側のマップをコピーする必要はなく、内側のマップをコピーする必要があると思います。

于 2012-12-13T04:27:16.953 に答える