【问题标题】:Synchronize multiple threads to edit a Hashmap [duplicate]同步多个线程以编辑 Hashmap [重复]
【发布时间】:2018-06-10 17:42:01
【问题描述】:

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

非常感谢您的帮助! :)

【问题讨论】:

标签: java multithreading synchronized


【解决方案1】:

问题与synchronize 无关,而是与您正在从正在迭代的集合中删除元素这一事实有关,buffer 映射。

你有几个方法可以遵循:

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

【讨论】:

    【解决方案2】:

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

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

    这将在第二次调用 it.hasNext() 时抛出 ConcurrentModificationException。

    问题是duplicated

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2015-09-25
      • 2016-09-11
      • 1970-01-01
      相关资源
      最近更新 更多