2016-03-25 1 views
0

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.

carte

remplit 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?

+0

Essayez-vous de modifier la collection que vous itérez au sein de votre boucle for? par exemple, supprimer/ajouter, etc. – beresfordt

+1

Que se passe-t-il dans votre boucle for? –

+0

@Louis Wasserman a ajouté du code au sujet – gstackoverflow

Répondre

1

ConcurrentModificationException:

Cette exception peut être levée par des méthodes qui ont détecté une modification concurrente d'un objet lorsque cette modification n'est pas admissible.

Si vous modifiez les clés/valeurs dans un Multimap lors de l'itération des touches/valeurs alors vous ne pouvez pas continuer à itérer après la modification (donc l'exception).

Envisagez d'utiliser Multimaps.transformValues(Multimap, Function) à la place.

+0

Je ne transforme pas les valeurs - je mets de nouveau – gstackoverflow

+0

@gstackoverflow Un put est une modification des clés/valeurs (a.k.a.) du multimap. – mfulton26