ConcurrentModificationException *seufz*
-
Hi,
ich bekomme eine ConcurrentModificationException geworfen, ich weiß auch woran es liegt aber da ich jedoch nicht so tief in Java stecke fehlen mir gerade die Ideen es zu beheben.
public static Vector<x> y(z) { Vector<x> ret = new Vector<x>(); ret.addAll(h(z)); for(Iterator<x> i = ret.iterator(); i.hasNext();) { ret.addAll(h(i.next)); } return ret; }
Wie unschwer zu erkennen ist liegt das Problem daran das ich die Struktur des Vektors ret modifiziere. Mir fehlt der Ansatz zum synchronisieren, Hilfestellung ist willkommen ;).
thx
tt
-
pack den kram einfach nicht direkt in deinen ret vector
public static Vector<x> y(z) { Vector<x> ret = new Vector<x>(); Vector<x> val = h(z); ret.addAll(h(z)); for(Iterator<x> i = val.iterator(); i.hasNext();) { ret.addAll(h(i.next)); } return ret; }
-
Für den Fall, dass die neuen Elemente auch gleich in derselben Schleife betrachtet werden sollen:
public static Vector<x> y(z) { Vector<x> ret = new Vector<x>(); ret.addAll(h(z)); for(int i = 0; i < ret.size(); i++) { ret.addAll(h(ret.get(i))); } return ret; }
Ist aber wahrscheinlich nicht allzu performant.
-
wenn man auf vector verzichtet und ne ArrayList verwendet, wird die performance gar nicht so schlimm sein. allerdings ist es generell eine schlechte idee, einen container innerhalb derselben schleife gleichzeitig zu lesen und zu modifizieren. führt zu den erstaunlichsten problemen.
-
thordk schrieb:
wenn man auf vector verzichtet und ne ArrayList verwendet, wird die performance gar nicht so schlimm sein. allerdings ist es generell eine schlechte idee, einen container innerhalb derselben schleife gleichzeitig zu lesen und zu modifizieren. führt zu den erstaunlichsten problemen.
sehr richtig
darüber hinaus:
der vector ist als collection für single thread anwendungen nicht geeignet, da diese klasse synchronisiert ist = langsam. die synchronisierung ist dazu da, bei konkurierenden zugriffen durch mehrere threads gleichzeitig die datenkonsistenz zu bewahren.
falls du ein singlethread programm schreibst, verwende lieber java.util.LinkedList oder java.util.ArrayList, da der vector einfach nicht für deinen anwendungsfall gedacht ist.
falls du ein multithreading programm schreibst: iteratoren sind nicht synchronisiert, d.h. nicht thread safe. bei konkurierenden zugriffen auf ein vector objekt auf dem iteriert wird musst du die nebenläufigkeit einschränken.gruß
-
Gar nicht leiden kann die ConcurrentModificationException ListIterator#add und ListIterator#remove.