我想让一个线程等待另一个线程完成在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));
}
}
}
}
}
非常感谢你的帮助! :)
答案 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