CopyOnWriteArrayList löst eine CurrentModificationException aus
Ich bekomme gelegentlich eineConcurrentModificationException
wenn ich über eine Liste iteriere. Eine Google-Suche informiert mich darüber, dass es wahrscheinlich daran liegt, dass ich diese Liste in einem anderen Thread ändere, während ich darüber iteriere. Um dieses Problem zu beseitigen, sollte ich verwendenjava.util.concurrent.CopyOnWriteArrayList
....
... außer ich bin es schon.
Anscheinend mache ich etwasJa wirklich Irgendwo dumm.
Hat jemand einen Einblick, wie man induzieren könnteCopyOnWriteArrayList
werfen aConcurrentModificationException
? Wenn es darauf ankommt, verwende ich Java 5.
Bearbeiten: Da die von mir verwendeten Mutatoren von Bedeutung sein können, ändere ich diese Liste auf zwei Arten:
Elemente zur Front hinzufügen. (list.add(0, newElement);
)Verwenden Sie die Unterliste, um ältere Elemente von der Rückseite fallen zu lassen. (list = list.subList(0, MAX_LIST_SIZE);
)Erhöhen diese die roten Fahnen? Wenn ja warum? Mein Verständnis war, dass, da diese Operationen zuerst eine Kopie der Sache erstellen, alle vorhandenen Iteratoren auf das nicht modifizierte Original zeigen würden und sich daher nicht darum kümmern würden. Habe ich ein Loch in meinem Wissen?
Bearbeiten 2: Der genaue Code, der das Problem verursacht, ist noch etwas unklar, aber ich kann zumindest die Ausnahme posten, die ich sehe:
java.util.ConcurrentModificationException
at java.util.concurrent.CopyOnWriteArrayList$COWSubList.checkForComodification(Unknown Source)
at java.util.concurrent.CopyOnWriteArrayList$COWSubList.iterator(Unknown Source)
at....
... wo es auf eine Instanziierung für jede Schleife in meinem Code verweist.
DasCOWSubList
scheint zu implizieren, dass mein Aufruf ansubList
ist die Wurzel meines Problems; Ich würde immer noch gerne verstehen, warum.
Edit 3: * facepalm *
CopyOnWriteArrayList.subList()
gibt a zurückList
, nicht a CopyOnWriteArrayList
. Die Liste, die es zurückgibt, unterliegt keiner impliziten Verpflichtung, COWALs Schutz zu bieten. Welches macht mitsubList()
So entfernen Sie Elemente einer sehr schlechten Idee.
Ich weiß nicht genau, ob das mein Schuldiger ist, aber es ist verdammt verdächtig und muss trotzdem korrigiert werden.