我有以下代码:
private Multimap<Object, ComplexCalcStrategy> strategies = HashMultimap.create();
....
Collection<ComplexCalcStrategy> strategiesThatNeedUpdating = strategies.get(mktDataChange.getOptionId());
for (ComplexCalcStrategy strategy : strategiesThatNeedUpdating) { //row number 88
updateMarketData(strategy.getStrategy(), mktDataChange);
}
在日志中我看到以下跟踪:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at com.google.common.collect.AbstractMapBasedMultimap$WrappedCollection$WrappedIterator.next(AbstractMapBasedMultimap.java:486)
at package.ClassName.processMarketDataChange(ClassName.java:88)
我不明白这段代码如何产生CME。
请分享您的想法。
P.S。
地图填写在这里:
@Override
public void registerStrategy(final ComplexCalcStrategy strategy) {
for (Integer optionId : strategy.getOptions()) {
strategies.put(optionId, strategy);
}
if (strategy.getStrategy().tiedToStock) {
strategies.put(strategy.getUnderlying(), strategy);
}
....
}
此方法在另一个线程中调用,看起来有时迭代和地图填充同时发生,这是根本原因。
据我所知,我可以使用multimap的同步版本。
它会解决问题吗?
有更好的方式吗?
答案 0 :(得分:1)
ConcurrentModificationException:
当不允许进行此类修改时,检测到并发修改对象的方法可能抛出此异常。
如果在键/值的迭代过程中修改Multimap
中的键/值,则在修改后无法继续迭代(因此异常)。