Verwendung des C # -Sperrschlüssels

8

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?

    
q0987 27.05.2011, 21:13
quelle

6 Antworten

6

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.

    
oleksii 27.05.2011 21:52
quelle
1

Ja und ja. Fälle sind korrekt.

    
konrad.kruczynski 27.05.2011 21:15
quelle
1

Ihr Verständnis ist 100% korrekt. Wenn Sie zum Beispiel den Einstieg in die beiden Methoden getrennt zulassen wollten, sollten Sie zwei Sperren haben.

    
Drew Marsh 27.05.2011 21:16
quelle
1

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%     
Teoman Soygul 27.05.2011 21:15
quelle
0

Ja, Sie haben in beiden Fällen Recht.

    
carlosfigueira 27.05.2011 21:16
quelle
0

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

    
Yaur 27.05.2011 23:17
quelle

Tags und Links