Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Warum lock (lock_object) statt lock (eigentliches_object)?
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5988
Herkunft: Leipzig

Themenstarter:

Warum lock (lock_object) statt lock (eigentliches_object)?

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
DaMoe80
myCSharp.de - Member



Dabei seit:
Beiträge: 508

beantworten | zitieren | melden

Moin!

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

Gruss,
DaMoe
private Nachricht | Beiträge des Benutzers
DaMoe80
myCSharp.de - Member



Dabei seit:
Beiträge: 508

beantworten | zitieren | melden

Nachtrag:

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

Evial lock(this)

Gruss,
DaMoe
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers