2016-06-29 8 views
0

In meiner Anwendung habe ich mehrere HashMaps. Einer von ihnen wirft gelegentlich ConcurrentModificationException. Problem ist, dass ich nicht weiß, wie man verfolgt, welche Karte es tatsächlich wirft, und wann die ConcurrentModification geschieht. Der Stack-Trace zeigt keine Zeilennummern an, wo es passiert. Der Beginn des Stack-Trace sieht liks dies:Wie verfolgen, welche HashMap wirft ConcurrentModificationException

java.util.ConcurrentModificationException 
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806) 
at java.util.HashMap$ValueIterator.next(HashMap.java:838) 
at com.parse.ParseTraverser.traverseInternal(ParseTraverser.java:87) 
at com.parse.ParseTraverser.traverse(ParseTraverser.java:137) 
at com.parse.ParseObject.collectFetchedObjects(ParseObject.java:817) 
at com.parse.ParseObject.access$700(ParseObject.java:49) 
at com.parse.ParseObject$13.then(ParseObject.java:1487) 
at com.parse.ParseObject$13.then(ParseObject.java:1484) 
at bolts.Task$15.run(Task.java:917) 
at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:105) 
at bolts.Task.completeAfterTask(Task.java:908) 
at bolts.Task.continueWithTask(Task.java:715) 

Antwort

0

Wenn Sie nicht beurteilen, welche HashMap zugleich durch zwei Operationen modifizieren (klassisches Beispiel ist eine Entfernung in einer Schleife) Sie immer ConcurrentHashMap verwenden können.

+0

Ja, ich weiß, aber ich wollte immer noch versuchen, herauszufinden, welche Karte es war, damit ich sehen konnte, wo das Problem lag. Wie auch immer, ist ConcurrentHashMap garantiert nicht ConcurrentModificationException zu werfen? Ich lese die Dokumente, und in meinem Verständnis sollte es nicht passieren, aber nachdem ich gerade versucht habe, alle meine HashMaps gleichzeitig zu machen (ich denke, ich habe alle), erhalte ich diesen Fehler manchmal. – Slagathor

+1

Eine ConcurrentHashMap ist synchronisiert, kann aber keine ConcurrentModificationException werfen. (wie in der Antwort erwähnt: Entfernung f.) – Xry

+0

Solange Sie nicht den Iterator von Ihnen ConcurrentHashMap weitergeben (jeder Thread verwendet seinen eigenen Iterator), sollte es sicher sein. –