kri*_*hna 6 java concurrency multithreading thread-safety
我正在使用以下构造来创建线程安全Map.
Collections.synchronizedMap(new LinkedHashMap());
Run Code Online (Sandbox Code Playgroud)
虽然我收到了ConcurrentModificationException错误.
没有代码,很难猜出什么是真正的问题,但我的猜测是,你没有使用返回的集合来执行操作.按照javadoc
为了保证串行访问,必须通过返回的集合完成对后备集合的所有访问.当迭代它时,用户必须手动同步返回的集合:
Collection c = Collections.synchronizedCollection(myCollection);
...
synchronized(c) {
Iterator i = c.iterator(); // Must be in the synchronized block
while (i.hasNext())
foo(i.next());
}
Run Code Online (Sandbox Code Playgroud)
不遵循此建议可能会导致非确定性行为.
这里不要贬低任何其他答案,但是下面的代码表明并发修改与实际的多线程没什么关系.当你说,迭代一个集合但在迭代时修改它时会导致它....
List list = new ArrayList();
list.add("1");
list.add("2");
Iterator i = list.iterator();
while (i.hasNext()) {
Object value = i.next(); // throws java.util.ConcurrentModificationException
list.add("another");
}
Run Code Online (Sandbox Code Playgroud)