Collections.synchronizedMap(new LinkedHashMap()); 没有使Map线程安全

kri*_*hna 6 java concurrency multithreading thread-safety

我正在使用以下构造来创建线程安全Map.

Collections.synchronizedMap(new LinkedHashMap());
Run Code Online (Sandbox Code Playgroud)

虽然我收到了ConcurrentModificationException错误.

kos*_*osa 8

没有代码,很难猜出什么是真正的问题,但我的猜测是,你没有使用返回的集合来执行操作.按照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)

不遵循此建议可能会导致非确定性行为.

  • 使用`ConcurrentHashMap`而不是`Collections.synchronizedCollection(myCollection);`可以避免这个问题. (3认同)

sli*_*eal 5

这里不要贬低任何其他答案,但是下面的代码表明并发修改与实际的多线程没什么关系.当你说,迭代一个集合但在迭代时修改它时会导致它....

  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)