同步多个线程编辑一个Hashmap
Synchronize multiple threads to edit a Hashmap
我想让一个线程等待另一个线程完成在 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
映射中删除元素这一事实有关。
您可以遵循的方法很少:
- 记住要删除的项目,然后删除它们
- 使用迭代器移动,直接从地图中移除
这不是同步问题。如果被迭代的基础集合被迭代器本身以外的任何东西修改,就会发生这种情况。
Iterator it = map.entrySet().iterator();
while (it.hasNext())
{
Entry item = it.next();
map.remove(item.getKey());
}
第二次调用 it.hasNext() 时将抛出 ConcurrentModificationException。
问题是duplicated
我想让一个线程等待另一个线程完成在 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
映射中删除元素这一事实有关。
您可以遵循的方法很少:
- 记住要删除的项目,然后删除它们
- 使用迭代器移动,直接从地图中移除
这不是同步问题。如果被迭代的基础集合被迭代器本身以外的任何东西修改,就会发生这种情况。
Iterator it = map.entrySet().iterator();
while (it.hasNext())
{
Entry item = it.next();
map.remove(item.getKey());
}
第二次调用 it.hasNext() 时将抛出 ConcurrentModificationException。
问题是duplicated