Ant*_*val 9 java concurrency multimap guava concurrentmodification
我不明白为什么在迭代这个时我得到一个ConcurrentModificationException multimap.我读了以下条目,但我不确定我是否理解了整个事情.我试图添加一个synchronized块.但我怀疑的是与什么同步,何时.
这multimap是一个字段,创建如下:
private Multimap<GenericEvent, Command> eventMultiMap =
Multimaps.synchronizedMultimap(HashMultimap.<GenericEvent, Command> create());
Run Code Online (Sandbox Code Playgroud)
并像这样使用:
eventMultiMap.put(event, command);
Run Code Online (Sandbox Code Playgroud)
并且像这样(我试图在地图上同步这部分,但没有成功)
for (Entry<GenericEvent, Command> entry : eventMultiMap.entries()) {
if (entry.getValue().equals(command)) {
eventMultiMap.remove(entry.getKey(), entry.getValue());
nbRemoved++;
}
}
Run Code Online (Sandbox Code Playgroud)
MHa*_*ris 11
在迭代它时对集合调用remove将导致每次都出现ConcurrentModificationException,即使它们都在同一个线程中完成 - 要做的事情就是获取一个显式的迭代器并在其上调用.remove().
编辑:修改您的示例:
Iterator<Map.Entry<GenericEvent, Command>> i = eventMultiMap.entries().iterator();
while (i.hasNext()) {
if (i.next().getValue().equals(command)) {
i.remove();
nbRemoved++;
}
}
Run Code Online (Sandbox Code Playgroud)
在java8中你还可以使用lambda方法:
eventMultiMap.entries().removeIf(genericEventCommandEntry -> genericEventCommandEntry.getValue().equals(command));
| 归档时间: |
|
| 查看次数: |
6766 次 |
| 最近记录: |