LinkedList und Threads: Strukturprobleme bez. löschen von Elementen

Rubber

Aktives Mitglied
Hi,
ich wollte euch mal Fragen, wie es am Besten ist mit LinkedLists und Threads zu arbeiten.
Ich habe momentan mehrere Threads, die alle von verschiedenen Stellen aus auf die LinkedList zugreifen.
(Thread1: malen, Thread2: berechnen, Thread3: eingaben bearbeiten)

Immer wieder kommt es jetzt vor, dass ein Thread gerade ein Element gelöscht hat, auf das ein anderer zugreifen wollte.

Nun dachte ich halt erstmal an synchronisieren mittels lock() und unlock().
Aber da weis ich gerade nicht recht, wie ich das am Sinnvollsten mache.

Momentan hand habe ich das bearbeiten einer Liste mittels
Java:
// normale bearbeitung
for(ListElement e : Klasse.getList()){
  //tue irgendwas
}

//löschen
Klasse.getList().remove(e);
mit
Java:
LinkedList<ListElement> list = new LinkedList<ListElement>();
//...
public LinkedList<ListElement> getList(){
  return list;
}

Wo könnte ich da denn lock() bzw unlock() einbauen?

Ansonsten hatte ich noch 3 andere Ideen, wie ich das Problem lösen könnte:
a) ich gebe nicht die Liste, sondern eine Kopie dieser Liste als Array zurück, wenn etwas gelesen werden soll, so sollte es nicht schlimm sein, wenn aus der original Liste etwas gelöscht wird - oder?

b) ich markiere Elemente nur zum löschen und überspringe diese dann beim auslesen und lasse sie dann immer durch einen Thread löschen. während er löscht müssen die anderen Threads zb warten (ich dachte da daran die getList() so zu modiizieren, dass sie halt nen while(loeschen){} drin hat

c) immer wenn eine lese operation beginnt verbiete ich mittels eines boolean das löschen (also ne eigene remove schreiben und die muss halt warten, bis lesen zu ende mittels while(lesen){}

Meine Frage ist nun:
Wie macht ihr sowas?
Bzw welche meiner Lösungen ist wohl die Beste?

Gruß,
David
 
Wo ist denn der Bearbeiten Button?

Wollte b) ersetzen durch:
Exeption abfangen und dann einfach ignorieren.
Beim nächsten durchlauf stimmts ja wieder
 
Benutze einmal die SUFU oder google.

Das ist ein Fehler, der JEDER Anfänger macht.

(Lösung: Iterieren mit Iterator und remove() am Iterator ausführen).:idea:
 

Neue Themen


Zurück
Oben