J'ai le code suivant:carte ConcurrentModificationException en-tête pour
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);
}
et dans les journaux que je vois suivant trace:
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)
Je ne comprends pas comment ce code peut produire CME.
S'il vous plaît, partagez vos idées.
P.S.
carteremplit ici:
@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);
}
....
}
Cette méthode invoque dans un autre thread et ressemble quelque temps itération et le remplissage de la carte et il se produit en même temps est la cause racine. Je comprends que je peux utiliser la version synchronisée de multimap.
Résoudrea-t-il le problème?
Y at-il une meilleure façon?
Essayez-vous de modifier la collection que vous itérez au sein de votre boucle for? par exemple, supprimer/ajouter, etc. – beresfordt
Que se passe-t-il dans votre boucle for? –
@Louis Wasserman a ajouté du code au sujet – gstackoverflow