Warum funktioniert die Sperre in diesem Code nicht?

7

Ich schrieb einen einfachen Code (angehängt) und ich verstehe nicht, warum die Sperre eines Blocks den Bereich nicht sperrt.

Der Code:

%Vor%

Ich erwarte, dass der Aufruf für die foo-Methode in der while-Schleife wartet, bis das Schließfach freigegeben wird (Schließfach-Gültigkeitsbereich) - aber alle Aufrufe des foo mit arg von ++ i können in den Schließfachblock eintreten.

    
Yanshof 11.04.2012, 03:37
quelle

4 Antworten

12

Das hier verwendete Schloss ist reentrant. Es verhindert, dass ein anderer Thread in den Monitor gelangt, aber der Thread, der die Sperre enthält, wird nicht blockiert.

    
Gabe 11.04.2012, 03:42
quelle
7

Das Schlüsselwort lock ist nur syntaktischer Zucker um die Methoden Monitor.Enter und Monitor.Exit . Wie in der Dokumentation für Monitor :

zu sehen
  

Es ist legal, dass der gleiche Thread mehrmals Enter aufruft, ohne dass er blockiert;

Der Aufruf von lock(object) aus demselben Thread mehr als einmal hat keinen anderen Effekt, als die Anzahl der Sperren zu erhöhen.

    
Michael Edenfield 11.04.2012 03:42
quelle
1

Die Sperre wird nicht angewendet, wenn Sie sich im selben Thread befinden. Siehe Ссылка

    
StuartLC 11.04.2012 03:42
quelle
1

Wenn Sie hier einen rekursiven Aufruf auf Thread t1 ausführen, wird kein separater Thread ausgeknipst. Der rekursive Aufruf wird im selben Thread t1 ausgeführt.

Da t1 das Schloss bereits hält, muss es nicht auf das Schloss warten.

    
Sandeep 11.04.2012 04:04
quelle

Tags und Links