Threading: Listenelement locken

28/11/2008 - 00:31 von Clemens Holzhüter | Report spam
Hallo,

Folgende Situation:
n Threads, 2 Collections

Die 2 Collections enthalten Objekte die zwischen den Collections
verschoben werden können.
Jedesmal wenn ich auf eine Collection zugreife wird diese gelockt, ein
Element herausgeholt und wieder unlocked. Das Objekt, welches ich aus
der Collection geholt habe wird in einer Methode ebenfalls wieder
gelockt und beim Beenden der Methode unlocked.
Beim ausführen der gerade erwàhnten Methode, kann es sein, dass ein
anderer Thread das Objekt aus der einen in die andere Collection
verschiebt. Meiner Meinung nach sollte das zu keinen Problemen führen,
da die Objekte in den Collections ja Referenzen sind und ich daher beim
verschieben nicht auf die Datenstruktur zugreife.

Habe ich das richtig verstanden? Wird beim locken eines Elements einer
Collection tatsàchlich nur das Element selbst gelockt? Möglich wàre IMO
auch, das die Anwendung auf diese Weise nicht Threadsafe ist, bzw. weil
dem so wàre ein "lock" gleich auch die Collections lockt, die die
Referenz zum gelockten Objekt enthalten.


bye Clemens
 

Lesen sie die antworten

#1 Elmar Boye
28/11/2008 - 10:44 | Warnen spam
Hallo Clemens,

Clemens Holzhüter schrieb:
Folgende Situation:
n Threads, 2 Collections

Die 2 Collections enthalten Objekte die zwischen den Collections
verschoben werden können.
Jedesmal wenn ich auf eine Collection zugreife wird diese gelockt, ein
Element herausgeholt und wieder unlocked. Das Objekt, welches ich aus
der Collection geholt habe wird in einer Methode ebenfalls wieder
gelockt und beim Beenden der Methode unlocked.
Beim ausführen der gerade erwàhnten Methode, kann es sein, dass ein
anderer Thread das Objekt aus der einen in die andere Collection
verschiebt.



Hier mußt Du aufpassen, das es nicht zu einer Race Condition kommt.
Die Sperren auf die beiden Collections müssen immer in der gleichen
Reihenfolge gesetzt und aufgehoben werden.
Ansonsten kann es passieren, dass z. B. Thead A eine Sperre auf
Collection 1 hat und eine auf Collection 2 nicht erhàlt, weil die
bereits durch Thread B gesperrt wurde, der wiederum als nàchstes
Collection 1 sperren will.

Als weitere Lektüre empfehle ich Dir Jeffrey Richters Kolumne
"Concurrent Affairs" im MSDN Magazine:
<URL:http://msdn.microsoft.com/en-us/mag...1.aspx>

dort findest Du einige Techniken beschrieben, die für eine
Synchronisation der Listen eingesetzt werden können.

Meiner Meinung nach sollte das zu keinen Problemen führen,
da die Objekte in den Collections ja Referenzen sind und
ich daher beim verschieben nicht auf die Datenstruktur zugreife.



Solange da keinerlei Verweise im Element auf die Auflistungen existieren
- z. B. ein Owner/Parent auf die Collection, muß das Element selbst
nicht gesperrt werden.

Habe ich das richtig verstanden? Wird beim locken eines Elements einer
Collection tatsàchlich nur das Element selbst gelockt?



Ja, die Sperre wirkt nur auf das angegebene Element.

Gruß Elmar

Ähnliche fragen