Laden...

Warum lock (lock_object) statt lock (eigentliches_object)?

Erstellt von MrSparkle vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.415 Views
MrSparkle Themenstarter:in
5.657 Beiträge seit 2006
vor 13 Jahren
Warum lock (lock_object) statt lock (eigentliches_object)?

Hallo,

ich hab hier ein kleines Snippet, das einen Ausschnitt aus einer Thread-sicheren Stack<T>-Klasse darstellt (Quelle: IProducerConsumerCollection<T> Interface). In der Push-Methode wird das m_lockObject gelockt, aber nicht das eigentliche Stack-Objekt. Kann mir jemand erklären, was dahinter steckt? Also warum nicht das Stack-Objekt gelockt wird, sondern ein einfaches Objekt, das nirgendwo sonst verwendet wird?

public class SafeStack<T> : IProducerConsumerCollection<T>
{
    // Used for enforcing thread-safety
    private object m_lockObject = new object();

    // We'll use a regular old Stack for our core operations
    private Stack<T> m_sequentialStack = null;

   
    public void Push(T item)
    {
        lock (m_lockObject) m_sequentialStack.Push(item);
    }

    // ....
}

Schöne Grüße,
Christian

Weeks of programming can save you hours of planning

D
500 Beiträge seit 2007
vor 13 Jahren

Moin!

Ein Lock auf das eigentliche Objekt kann schneller zu einem Deadlock fuehren, weshalb es ratsam ist ein separates Lockobjekt zu verwenden.

Gruss,
DaMoe

D
500 Beiträge seit 2007
vor 13 Jahren

Nachtrag:

Es ist nicht das beste Beispiel, aber zeigt das Problem eines Deadlock in Kombination mit lock(this):

Evial lock(this)

Gruss,
DaMoe

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo MrSparkle,

das Thema wurde bereits ausführlich in Sollte man lock this vermeiden? und und in Entwurfsmuster Singleton und Schlüsselwort synchronized (und folgende Beiträge) diskutiert.

Hallo DaMoe80,

sicher können bei falscher Synchronisation Deadlocks auftreten, aber das ist kein spezifisches Problem von lock (this) und es ist keinesfalls so, dass wenn man lock (this) vermeidet, keine Deadlocks mehr auftreten können. Im Gegenteil entstehen durch die Vermeidung von lock (this) neue Situationen in den Deadlocks auftreten können, die bei lock (this) nicht auftreten würden.

herbivore