首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免TreeMap ConcurrentModificationException?

避免TreeMap ConcurrentModificationException?
EN

Stack Overflow用户
提问于 2012-12-18 14:34:23
回答 5查看 11.2K关注 0票数 13

我正在调用返回TreeMap实例的函数,并且在调用代码中我想修改TreeMap。然而,我得到了一个ConcurrentModificationException

下面是我的代码:

代码语言:javascript
运行
复制
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;
}

我的调用代码是:

代码语言:javascript
运行
复制
Map<String, String> key_values =Collections.synchronizedMap(Classname.function1());
//here key_values.put() giving ConcurrentModificationException
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-12-18 17:40:15

如果你使用ConcurrentSkipListMap,速度会更快,不会有这个问题。

代码语言:javascript
运行
复制
public NavigableMap<String, String> function1() {
    NavigableMap<String, String> key_values = new ConcurrentSkipListMap<String, String>();
    // all key_values.put() goes here

    return key_values;
}

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

票数 6
EN

Stack Overflow用户

发布于 2012-12-18 14:47:29

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

我的猜测是,在您省略的代码中,您正在迭代Map.entrySetMap.keySetMap.values之一,并在此迭代期间调用put (在for循环中)。使用您所展示的代码,这是唯一可能实现的方法。

票数 15
EN

Stack Overflow用户

发布于 2012-12-18 14:49:13

您似乎正在获取已同步映射的同步映射。如果我将对function1()的调用替换为it's contents (simplified),我们得到:

代码语言:javascript
运行
复制
Map<String, String> key_values =Collections.synchronizedMap(Collections.synchronizedMap( new TreeMap<String, String>()));

我认为你的呼叫线应该改为:

代码语言:javascript
运行
复制
Map<String, String> key_values = Classname.function1();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13927572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档