Ich poste mein Verständnis von C # sperren wie folgt, bitte helfen Sie mir zu überprüfen, ob ich es richtig mache oder nicht.
%Vor%Fall I & gt; Thread1 und Thread2 versuchen gleichzeitig, PrintOne aufzurufen. Da PrintOne nur zu jeder Zeit von der Instanzsperre geschützt wird Ein Thread kann ausschließlich die SectionOne eingeben.
Stimmt das?
Fall II & gt; Thread1 und Thread2 versuchen gleichzeitig, PrintOne und PrintTwo aufzurufen (d. h. Thread1 ruft PrintOne- und Thread2-Aufrufe PrintTwo auf) Da zwei Druckmethoden zu jeder Zeit von derselben Instanzsperre geschützt werden, Nur ein Thread kann exklusiv entweder auf SectionOne oder SectionTwo, aber NICHT auf beide zugreifen.
Stimmt das?
1 und 2 sind true only , wenn alle Ihre Threads die dieselbe Instanz der Klasse verwenden. Wenn sie verschiedene Instanzen verwenden , sind beide Fälle false
Beispiel
%Vor%Und Testcode
%Vor%Eine der möglichen Lösungen besteht darin, der Sperrobjektdeklaration und den Methoden, die sie verwenden, ein statisches Schlüsselwort hinzuzufügen.
%Vor%UPDATE Guter Punkt gemacht von konrad.kruczynski
... "Fadensicherheit" wird auch von angenommen Kontext. Zum Beispiel könnte ich nehmen Ihr Dateieröffnungscode und auch Ausnahme mit statischer Sperre generieren - nur eine andere Anwendung nehmen Domain. Und schlagen Sie deshalb OP vor sollte systemweite Mutex-Klasse oder verwenden So ähnlich. Daher statischer Fall wird nur als Instanz abgeleitet.
Ihr Verständnis ist 100% korrekt. Wenn Sie zum Beispiel den Einstieg in die beiden Methoden getrennt zulassen wollten, sollten Sie zwei Sperren haben.
Fall I: Überprüfen Sie ✓
Fall II: Überprüfen Sie ✓
Vergessen Sie nicht, dass das Sperren nur eine Möglichkeit der Thread-Synchronisation ist. Für andere nützliche Methoden lesen Sie: Thread-Synchronisation
>Direkt aus dem MSDN-Beispiel:
%Vor%Hier sind die Grundlagen (mehr oder weniger)
1) Verwenden Sie Instanzsperren für Instanzdaten
%Vor%2) statische Sperren für statische Daten verwenden
%Vor%3) Wenn Sie statische und Instanzdaten schützen, verwenden Sie separate statische und Instanzsperren
%Vor%basierend darauf ist Ihr Code in Ordnung, wenn Sie auf Instanzdaten zugreifen, aber unsicher, wenn Sie statische Daten ändern
Tags und Links c# multithreading locking