避免TreeMap ConcurrentModificationException?

fee*_*ing 12 java treemap concurrentmodification

我正在调用返回TreeMap实例的函数,并在调用代码中我想修改TreeMap.但是,我得到了一个ConcurrentModificationException.

这是我的代码:

public Map<String, String> function1() {
    Map<String, String> key_values = Collections.synchronizedMap(new TreeMap<String, String>());
    // all key_values.put() goes here

    return key_values;
}
Run Code Online (Sandbox Code Playgroud)

我的调用代码是:

Map<String, String> key_values =Collections.synchronizedMap(Classname.function1());
//here key_values.put() giving ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 14

请注意,如果您使用的是迭代器,Collections.synchronizedMap永远不会保护您免受并发修改.此外,除非您Map从多个线程访问您,否则创建同步映射是没用的.不需要将本地范围的集合和变量传递给其他线程synchronized.

我的猜测是,在你离开了代码,你遍历之一Map.entrySet,Map.keySetMap.values,并呼吁put 该迭代(在内部for循环).使用您显示的代码,这是唯一可能发生的方式.


Pet*_*rey 6

如果你使用ConcurrentSkipListMap可以更快并且没有这个问题.

public NavigableMap<String, String> function1() {
    NavigableMap<String, String> key_values = new ConcurrentSkipListMap<String, String>();
    // all key_values.put() goes here

    return key_values;
}
Run Code Online (Sandbox Code Playgroud)

如果您不需要对键进行排序,则可以使用ConcurrentHashMap.

  • 了解*跳过列表*是什么有用:https://en.wikipedia.org/wiki/Skip_list (2认同)