同步多个线程以编辑Hashmap

时间:2018-06-10 17:42:02

标签: java multithreading synchronized

我想让一个线程等待另一个线程完成在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));
                }
            }
        }
    }
}

非常感谢你的帮助! :)

2 个答案:

答案 0 :(得分:1)

问题与synchronize无关,而是与您正在迭代的集合中删除元素buffer地图。

您没有什么方法可以遵循:

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

答案 1 :(得分:0)

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

Iterator it = map.entrySet().iterator();
while (it.hasNext())
{
   Entry item = it.next();
   map.remove(item.getKey());
}

第二次调用it.hasNext()时会抛出ConcurrentModificationException。

问题是duplicated