Java 同步多个线程以编辑哈希映射

Java 同步多个线程以编辑哈希映射,java,multithreading,synchronized,Java,Multithreading,Synchronized,我想让一个线程等待另一个线程在Hashmap上完成编写,但我总是得到一个java.util.ConcurrentModificationException,即使我同步了该方法 这是我的密码: HashMap<Page, Integer> prebuffer = new HashMap<Page, Integer>(); Map<Page,Integer> buffer = Collections.synchronizedMap(prebuffer); pri

我想让一个线程等待另一个线程在Hashmap上完成编写,但我总是得到一个java.util.ConcurrentModificationException,即使我同步了该方法

这是我的密码:

HashMap<Page, Integer> prebuffer = new HashMap<Page, Integer>();
Map<Page,Integer> buffer = Collections.synchronizedMap(prebuffer);

private synchronized void bufferContaining(int pageid) {
    synchronized (buffer) {
        if (buffer.size() > 1) {
            for (Map.Entry<Page, Integer> entry : buffer.entrySet()) {
                Page page = entry.getKey();
                int taIds = entry.getValue();
                if (page.pid == pageid) {
                    buffer.remove(page, new Integer(taIds));
                }
            }
        }
    }
}
HashMap prebuffer=newhashmap();
映射缓冲区=Collections.synchronizedMap(预缓冲区);
私有同步的void缓冲区(int pageid){
已同步(缓冲区){
if(buffer.size()>1){
for(Map.Entry:buffer.entrySet()){
Page=entry.getKey();
int taIds=entry.getValue();
如果(page.pid==pageid){
删除(第页,新整数(taIds));
}
}
}
}
}

非常感谢您的帮助!:)

问题与
同步
无关,而是与从迭代的集合中删除元素
缓冲区
映射有关

您可以遵循的方法很少:

  • 记住要删除的项目,然后删除它们
  • 使用迭代器移动并直接从映射中删除

    • 这不是同步问题。如果被迭代的基础集合被迭代器本身以外的任何东西修改,就会发生这种情况

      Iterator it = map.entrySet().iterator();
      while (it.hasNext())
      {
         Entry item = it.next();
         map.remove(item.getKey());
      }
      
      这将在第二次调用it.hasNext()时引发ConcurrentModificationException

      问题是