Synchronisierte Listen. ein Graus

Status
Nicht offen für weitere Antworten.
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:

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
 

SnooP

Top Contributor
Du musst auf jeden Fall vermeiden mit Hilfe eines Iterators über die Liste zu iterieren und gleichzeitig diese Liste zu verändern... der Iterator wird dadurch sofort ungültig und schmeißt die beobachtete Exception...
Andere Möglichkeiten: Du nutzt nicht den Iterator sondern durchläufst mit get-Methoden die Liste... - hast aber dann evtl. auch Probleme, synchronisiert muss es in jedem Fall ablaufen...
Oder aber du speicherst alle Zugriffe auf die Liste in einer zweiten Liste zwischen (add-List, remove-List) und machst am Ende der Änderungen - in einem stabilen Zustand - ein commit, indem du ein addAll bzw. removeAll über deine Zwischenlisten machst...
 
S

SlaterB

Gast
wozu schreibst du jeweils
while(mutex);
?
wenn mehrere Threads drauf zugreifen wollen, dann arbeiten alle mit 100%, statt auf den synchronized-Zugriff zu WARTEN,
lasse doch die Arbeit weg und die Threads wieder warten, dazu ist das synchronized doch da?

und dann kannst du gleich
public synchronized boolean remove(Object o)
{
...
schreiben an Stelle deiner Konstruktion, sieht viel schöner aus,

-----------

übrigens ist so eine Schleife auch nicht sicher,
wenn ein Thread fertig ist, können (theoretisch) zwei andere Threads (oder ein anderer und der gleiche nochmal)
die while-Schleife überspringen (da mutex false ist) und dann zusammen vor dem synchronized stehen,
deine Abfrage hilft also (thoretisch) gar nicht, aber synchronized ist natürlich sicher
 
G

Guvnor

Gast
@ SlaterB: Du hast Recht, ich hab das dann auch geändert und die Methoden direkt synchronized gemacht. Aber auch das half nicht.

Nun habe ich einen völlig anderen Ansatz. Ich habe eine Queue, der ich Objekte adden kann und von der ich auch getten kann. Beim getten wird das Objekt aber direkt wieder removed. Somit iteriere ich nicht über die Liste, sondern hol mir in jedem Schleifendurchlauf innerhalb meines Threads einfach immer das älteste Objekt und arbeite damit. Dann wird es removed und erst im nächsten Durchlauf kommt das nächste dran.

In meinem Anwendungsfall paßt das perfekt, somit kann ich nun auf das Iterieren verzichten :)

Trotzdem vielen Dank für eure Antworten, auch wenn ich jetzt natürlich eine ganz andere Lösung verwende :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Zwei Listen vergleichen Allgemeine Java-Themen 7
M doppelt verkettete Listen Allgemeine Java-Themen 2
L Listen Allgemeine Java-Themen 3
F Verständnisprobleme Aufgabenstellung Aktionsobjekte und generische Listen Allgemeine Java-Themen 1
E Listen in Java aneinanderfügen, subtrahieeren usw. Allgemeine Java-Themen 14
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
J Mit Referenzen verkettet Listen. Allgemeine Java-Themen 9
S Intressante Benchmark-Ergebnisse mit Listen. Weiss jemand wie man diese erklaeren kann? Allgemeine Java-Themen 15
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
P Listen sortieren Allgemeine Java-Themen 1
RalleYTN Collections Verständnisfrage zu Objektreferenzen in Listen Allgemeine Java-Themen 5
C Listen Allgemeine Java-Themen 1
M liste von listen anders ausgeben Allgemeine Java-Themen 1
W Sortierte Listen - Methode suchen Allgemeine Java-Themen 17
W Sortierte Listen mit Polymorphismus Allgemeine Java-Themen 6
J Rekursion oder Iteration - verkettete Listen Allgemeine Java-Themen 8
S Permutation und Listen Allgemeine Java-Themen 2
P Doppeltverkettete Listen + Text Allgemeine Java-Themen 5
A Java Projekt (Daten Eingeben, Speichern und in Listen Ausgeben) Allgemeine Java-Themen 6
F JAXB / Listen durchlaufen Allgemeine Java-Themen 17
T Drucken von variabel langen Listen (es kommen nur leere Seiten raus) Allgemeine Java-Themen 2
F Vergleich zweier Listen Allgemeine Java-Themen 4
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
D variabler Listen name Allgemeine Java-Themen 3
V Drucken von Listen Allgemeine Java-Themen 6
S Doppelte Werte in Listen,Vectoren etc suchen Allgemeine Java-Themen 2
L verkettete Listen oder Arrays + Indexlisten effizienter? Allgemeine Java-Themen 3
M Addieren von Listen Allgemeine Java-Themen 2
F Objekte oder besser ID in Listen speichern? Allgemeine Java-Themen 2
S Mehrere Listen ineinander verschachteln Allgemeine Java-Themen 22
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
R Objektsynchronisierung zweier Listen?!?! Allgemeine Java-Themen 2
H Listen Allgemeine Java-Themen 5
G Datenstruktur: LISTEN Allgemeine Java-Themen 7
J Verschachtelte ListIteratoren um in zwei Listen hin und herzugehen Allgemeine Java-Themen 5
C Problem Methoden, Klassen, Listen Allgemeine Java-Themen 27
K Listen,Bäume,Mengen Allgemeine Java-Themen 3
S Hinzufügen von Elementen zu Listen Allgemeine Java-Themen 4
A zwei listen vergleichen und unterschiede anzeigen Allgemeine Java-Themen 3
D Listen / Datenstrukturen und ein blutiger Anfänger Allgemeine Java-Themen 7
J Zwei sortierte Listen zusammenfassen Allgemeine Java-Themen 8
T Problem mit Listen Allgemeine Java-Themen 8
B binarysearch bei listen mit klassen Allgemeine Java-Themen 4
F Problem mit Java Listen Allgemeine Java-Themen 4
D Listen von Generischen Typen inkl. Vererbung Allgemeine Java-Themen 2
C Listen in Java. Anehängter Code nicht ganz klar Allgemeine Java-Themen 19
L Doppelt Verkettete Listen Allgemeine Java-Themen 6
E Verkettete Listen Allgemeine Java-Themen 5
M objekt mit listen Allgemeine Java-Themen 5
G Domainen crawlen & Domainnamen listen -> LANGSAM! Allgemeine Java-Themen 19
M Listen Problem! Allgemeine Java-Themen 26
M doppelt verkettete Listen? Allgemeine Java-Themen 5
M Serialisierte listen ausgeben? Allgemeine Java-Themen 6
F 2 Varianten für synchronisierten Zugriff auf Listen Allgemeine Java-Themen 2
L Welche Collection ist die richtige ? Listen mergen Allgemeine Java-Themen 3
M Verknüpfung von Listen Allgemeine Java-Themen 3
S Frage zu ArrayList mit Listen Allgemeine Java-Themen 8
S Fragen zu 4 speziellen Listen Allgemeine Java-Themen 4
D Listen Allgemeine Java-Themen 4
M sortierte listen Allgemeine Java-Themen 5
I Doppelt verkette Listen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben