G
Guvnor
Gast
Hallo!
Ich verzweifel hier noch fast. Ich habe ein kleines Programm, wo von mehreren Threads auf die gleiche Liste zugegriffen wird. Dadurch fliegt dauernd eine ConcurrentModificationException, weil z.B. der eine Thread gerade über die Liste iteriert und der andere ein Element hinzufügen will.
Dann habe ich es mit der synchronizedList versucht, also auf die folgende Art und Weise:
Das hat deutlich besser funktioniert, aber bei vielen "Anfragen", also vor allem vielen Hinzufügungen, ist auch das gescheitert. Mit der gleichen Exception wie davor schon.
Danach hab ich mir meine eigene List gemacht, indem ich einfach von der ArrayList abgeleitet hab und die get, add, remove und clear-Methoden überschrieben hab. Laut JavaDoc funktioniert die Iteration ebenfalls durch die get-Methode, dadurch sollte es ja reichen, die gerade eben erwähnten Methoden zu überschreiben. Aber auch das half nix. Der Vollständigkeit halber hier trotzdem mal mein Code, obwohl ich eigentlich der Meinung bin, daß der funktionieren müßte:
Kann mir vielleicht doch noch einer helfen? Für was ist ein Collections.synchronizedList() da, wenn es keine synchronisierte Liste zurückgibt? Oder ist die JVM zu langsam für eine erfolgreiche Synchronisation? Oder muß ich doppelt und dreifach synchronisieren?
Danke schonmal im Voraus,
Guvnor
Ich verzweifel hier noch fast. Ich habe ein kleines Programm, wo von mehreren Threads auf die gleiche Liste zugegriffen wird. Dadurch fliegt dauernd eine ConcurrentModificationException, weil z.B. der eine Thread gerade über die Liste iteriert und der andere ein Element hinzufügen will.
Dann habe ich es mit der synchronizedList versucht, also auf die folgende Art und Weise:
Code:
list = Collections.synchronizedList(list);
Das hat deutlich besser funktioniert, aber bei vielen "Anfragen", also vor allem vielen Hinzufügungen, ist auch das gescheitert. Mit der gleichen Exception wie davor schon.
Danach hab ich mir meine eigene List gemacht, indem ich einfach von der ArrayList abgeleitet hab und die get, add, remove und clear-Methoden überschrieben hab. Laut JavaDoc funktioniert die Iteration ebenfalls durch die get-Methode, dadurch sollte es ja reichen, die gerade eben erwähnten Methoden zu überschreiben. Aber auch das half nix. Der Vollständigkeit halber hier trotzdem mal mein Code, obwohl ich eigentlich der Meinung bin, daß der funktionieren müßte:
Code:
public class SyncList<T> extends ArrayList<T>
{
private boolean mutex = false;
private static final long serialVersionUID = 1L;
public T get(int i)
{
while(mutex);
synchronized(this)
{
mutex = true;
T temp = super.get(i);
mutex = false;
return temp;
}
}
public boolean add(T o)
{
while(mutex);
synchronized(this)
{
mutex = true;
boolean result = super.add(o);
mutex = false;
return result;
}
}
public boolean remove(Object o)
{
while(mutex);
synchronized(this)
{
mutex = true;
boolean result = super.remove(o);
mutex = false;
return result;
}
}
public void clear()
{
while (mutex);
synchronized(this)
{
mutex = true;
super.clear();
mutex = false;
}
}
}
Kann mir vielleicht doch noch einer helfen? Für was ist ein Collections.synchronizedList() da, wenn es keine synchronisierte Liste zurückgibt? Oder ist die JVM zu langsam für eine erfolgreiche Synchronisation? Oder muß ich doppelt und dreifach synchronisieren?
Danke schonmal im Voraus,
Guvnor