Hallo alle miteinander,
Wieder einmal stehe ich vor einem recht doofen Problem, wahrscheinlich ist es sowieso einfach zu lösen, aber ich stehe irgendwie auf dem Schlauch. Es geht darum den Zugriff von 2 Methoden auf eine ArrayList zu synchronisieren(?), was mir irgendwie nicht gelingen will...
Kurze Erklärung: Ich habe eine Klasse die eine ArrayList beinhaltet. 2 Methoden greifen darauf zu, die werden von 2 verschiedenen Threads aus aufgerufen. Die eine Methode (im Beispiel methode1) soll bestimmte Einträge der ArrayList entfernen, die andere Methode (methode2) soll ein Object der ArrayList hinzufügen und gegebenfalls ein anderes Object aus der ArrayList entfernen (falls es mit dem hinzugefügten Object obsolet wird).
Und jetzt schmeisst mir der eine Exception:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at XXX.YYY.MyObject.updateHostList(MyObject.java:16)
at XXX.YYY.Thread1.run(Thread1.java:76)
at java.lang.Thread.run(Unknown Source)
Ich war der Meinung, wenn ich die Methoden "synchronized" deklariere, dann wird immer nur entweder die eine oder die andere Methode ausgeführt. Offenbar hat er da ein Problem mit dem Iterator. Hat vielleicht wer einen Tipp für mich, verlange gar keine fertige Lösung, nur irgendwie eine Richtung...
Wieder einmal stehe ich vor einem recht doofen Problem, wahrscheinlich ist es sowieso einfach zu lösen, aber ich stehe irgendwie auf dem Schlauch. Es geht darum den Zugriff von 2 Methoden auf eine ArrayList zu synchronisieren(?), was mir irgendwie nicht gelingen will...
Kurze Erklärung: Ich habe eine Klasse die eine ArrayList beinhaltet. 2 Methoden greifen darauf zu, die werden von 2 verschiedenen Threads aus aufgerufen. Die eine Methode (im Beispiel methode1) soll bestimmte Einträge der ArrayList entfernen, die andere Methode (methode2) soll ein Object der ArrayList hinzufügen und gegebenfalls ein anderes Object aus der ArrayList entfernen (falls es mit dem hinzugefügten Object obsolet wird).
Code:
import java.util.ArrayList;
import java.util.Iterator;
public class MyObject {
private ArrayList<MyOtherObject> liste;
public MyObject() {
liste = new ArrayList<MyOtherObject>();
}
synchronized public methode1() {
Iterator<MyOtherObject> iter = liste.iterator();
while(iter.hasNext()) {
MyOtherObject test = iter.next();
if(test.checkSometing()) {
liste.remove(test);
}
}
}
synchronized public methode2(MyOtherObject obj) {
Iterator<MyOtherObject> iter = liste.iterator();
while(iter.hasNext()) {
MyOtherObject test = iter.next();
if(test.getSomething().equals(obj.getSomeThing())) {
liste.remove(test);
}
}
liste.add(obj);
}
}
Und jetzt schmeisst mir der eine Exception:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at XXX.YYY.MyObject.updateHostList(MyObject.java:16)
at XXX.YYY.Thread1.run(Thread1.java:76)
at java.lang.Thread.run(Unknown Source)
Ich war der Meinung, wenn ich die Methoden "synchronized" deklariere, dann wird immer nur entweder die eine oder die andere Methode ausgeführt. Offenbar hat er da ein Problem mit dem Iterator. Hat vielleicht wer einen Tipp für mich, verlange gar keine fertige Lösung, nur irgendwie eine Richtung...