Nein, nicht solange Sie dasselbe Objekt sperren. Der rekursive Code hat effektiv bereits die Sperre und kann daher ungehindert fortgesetzt werden.
lock(object) {...}
ist eine Abkürzung für die Verwendung der Monitor- Klasse. Wie Marc weist darauf hin , Monitor
ermöglicht Neueintritt , so versucht auf einem Objekt Sperre wiederholt , auf dem der aktuelle Thread bereits eine Sperre hat wird gut funktionieren.
Wenn Sie anfangen, verschiedene Objekte zu sperren , müssen Sie vorsichtig sein. Achten Sie besonders auf:
- Erwerben Sie immer Sperren für eine bestimmte Anzahl von Objekten in derselben Reihenfolge.
- Lösen Sie Sperren immer in umgekehrter Reihenfolge, wie Sie sie erwerben.
Wenn Sie gegen eine dieser Regeln verstoßen, werden Sie garantiert irgendwann Deadlock-Probleme bekommen .
Hier ist eine gute Webseite, die die Thread-Synchronisation in .NET beschreibt: http://dotnetdebug.net/2005/07/20/monitor-class-avoiding-deadlocks/
Sperren Sie außerdem so wenige Objekte wie möglich gleichzeitig. Erwägen Sie, wenn möglich, grobkörnige Schlösser anzubringen. Die Idee ist, dass Sie dies tun können, wenn Sie Ihren Code so schreiben können, dass ein Objektdiagramm vorhanden ist und Sie Sperren für die Wurzel dieses Objektdiagramms erwerben können. Dies bedeutet, dass Sie eine Sperre für dieses Stammobjekt haben und sich daher nicht so sehr um die Reihenfolge kümmern müssen, in der Sie Sperren erwerben / freigeben.
(Ein weiterer Hinweis: Ihr Beispiel ist technisch nicht rekursiv. Damit es rekursiv ist, Bar()
muss es sich selbst aufrufen, normalerweise als Teil einer Iteration.)