ConcurrentModificationException

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
Ich habe in meinem Programm eine Liste von Objekten, konkret eine ArrayList. Innerhalb eines Threads wird die Liste immer wieder mit einem Iterator durchlaufen, manchmal werden auch Elemente entfernt. Nun ist neu hinzu gekommen, dass über Benutzereingaben (MouseListener) zur Liste neue Elemente hinzugefügt werden können.

Jetzt tritt manchmal beim Durchlaufen der Liste eine java.util.ConcurrentModificationException auf.
1. Ist das so, weil die ArrayList nicht threadsafe ist?
2. Verhindere ich dieses Problem endgültig durch Benutzung von von Vector anstelle der ArrayList?
 

tfa

Top Contributor
Evolver hat gesagt.:
1. Ist das so, weil die ArrayList nicht threadsafe ist?
2. Verhindere ich dieses Problem endgültig durch Benutzung von von Vector anstelle der ArrayList?

Nein, tust du nicht. Sobald ein Iterator die Liste durchläuft und sie von einem anderen (oder dem auch dem selben)Thread aus geändert wird, kommt diese Exception. Du könntest die Collection kopieren, bevor du den Iterator erzeugst.
Da du aber mit mehreren Threads arbeitest brauchst du sowieso eine Art Synchronisation, z.B. Vector oder Collections.synchronizedList(..).
 
M

maki

Gast
Oder du änderst die Collection ausschliesslich über den iterator.

Iterator bietet nur remove() an, ListIterator kann auch add(Object).
 

Marco13

Top Contributor
Auch bei einem Vector (oder besser: einer Collections.synchronizedList) wirst du synchronisation brauchen, wenn du einen Iterator (d.h. auch die neue foreach-Schleife) verwendest.... So, wie es auch in der Doku zu Collections.synchronizedList steht:
Code:
// Thread 1:
    list.add(new Element());
    list.remove(3);

// Thread 2:
    synchronzied(list)  // <--- Wischtisch
    {
          for (Element element : list) element.doSomething();
    }
 

JavaFred

Aktives Mitglied
synchronized nur in einem Thread zu verwenden bringt gar nichts. Auch Thread 1 muss Zugriffe auf den Vector in einem synchronized-Block realisieren!
 

Marco13

Top Contributor
Ich habe ja von einem Vector oder einer synchronizedList gesprochen. Da sind die Zugriffe automatisch auf die 'list' selbst synchronized. Bei einem Iterator muss man aber trotzdem(!) noch explizit den synchronized-Block (eben AUCH auf die 'list') drumrumschreiben.
 

Evolver

Bekanntes Mitglied
Also ich habe es jetzt bei einer ArrayList belassen und jeden zugriff darauf in einen synchronized-Block gepackt. Das Problem sollte jetzt also nichtmehr auftreten, wenn ich eure Antworten richtig gedeutet habe. Ja?

Aber das erscheint mir bissel umständlich. Könnte ich nicht irgendwie zentral festlegen, dass jeder Zugriff darauf nur synchonized erfolgt?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ConcurrentModificationException Allgemeine Java-Themen 2
D java.util.ConcurrentModificationException tritt auf Allgemeine Java-Themen 12
F ConcurrentModificationException warum ? Allgemeine Java-Themen 7
K Collections java.util.ConcurrentModificationException Allgemeine Java-Themen 3
N ConcurrentModificationException Allgemeine Java-Themen 2
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
D java.util.ConcurrentModificationException - per Copy vermeiden Allgemeine Java-Themen 11
D java.util.ConcurrentModificationException bei ArrayList Allgemeine Java-Themen 2
F ConcurrentModificationException Allgemeine Java-Themen 2
P Vectoren bearbeiten: ConcurrentModificationException Allgemeine Java-Themen 4
B ConcurrentModificationException Allgemeine Java-Themen 3
G ConcurrentModificationException - finds nicht Allgemeine Java-Themen 5
S Fehler ConcurrentModificationException Allgemeine Java-Themen 8
R java.util.ConcurrentModificationException vermeiden? Allgemeine Java-Themen 8
R ConcurrentModificationException Allgemeine Java-Themen 9
D ConcurrentModificationException nicht nachvollziehbar Allgemeine Java-Themen 8
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
J java.util.ConcurrentModificationException bei HashMap? Allgemeine Java-Themen 2
G ConcurrentModificationException Allgemeine Java-Themen 4
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
P java.util.ConcurrentModificationException Allgemeine Java-Themen 9
M ConcurrentModificationException Allgemeine Java-Themen 6
S ConcurrentModificationException Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben