This question already has answers here:
Why is a ConcurrentModificationException thrown and how to debug it
                            
                                (7个答案)
                            
                    
                2年前关闭。
        

    

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


非常感谢您的帮助! :)

最佳答案

该问题与synchronize无关,而是与您正在从其中进行迭代的集合(buffer映射)中删除元素的事实有关。

您有几种方法可以遵循:


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

关于java - 同步多个线程以编辑Hashmap ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50786417/

10-10 09:36