映射ConcurrentModificationException for header

时间:2016-03-25 21:10:20

标签: java exception dictionary guava concurrentmodification

我有以下代码:

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的同步版本。

它会解决问题吗?

有更好的方式吗?

1 个答案:

答案 0 :(得分:1)

ConcurrentModificationException

  

当不允许进行此类修改时,检测到并发修改对象的方法可能抛出此异常。

如果在键/值的迭代过程中修改Multimap中的键/值,则在修改后无法继续迭代(因此异常)。

请考虑使用Multimaps.transformValues(Multimap, Function)