Ich erwarte, dass Sie den folgenden Code in einer Sackgasse, wenn löscht auf das gleiche Objekt zu sperren versucht, die bereits gesperrt Bauen hat:Warum blockiert dieser Code nicht?
void Main()
{
(new SiteMap()).Build();
}
class SiteMap
{
private readonly object _lock = new object();
public void Build()
{
lock (_lock)
{
Clear();
Console.WriteLine("Build");
}
}
public void Clear()
{
lock (_lock)
{
Console.WriteLine("Clear");
}
}
}
Ausgang:
Klar
Bauen
Edit 1
Vielen Dank für Ihre Antworten.
Wenn ich einen Anruf hinzufügen im Inneren der Schleuse von Clear (halten den Rest des Codes gleich) Build:
public void Clear()
{
lock (_lock)
{
Build();
Console.WriteLine("Clear");
}
}
Ein Deadlock auftritt (oder zumindest das ist, was ich denke, LINQ Pad Abstürze).
Laut Ihren Antworten sollte dies nicht passieren, weil es immer noch der gleiche Thread ist.
Danke!
Siehe http://www.albahari.com/threading/part2.aspx, unter "Nested Locking". –