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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage