Spodziewam następujący kod do impasu gdy Wyczyść próbuje zablokować na tym samym obiekcie, które budują już zablokowaneDlaczego ten kod nie jest zakleszczony?
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");
}
}
}
wyjściowa:
Wyczyść
Budowa
Edycja 1
Dziękuję wszystkim za odpowiedzi.
Jeśli dodać wezwanie do budowania wewnątrz zamka jasne (zachowując resztę kodu taka sama):
public void Clear()
{
lock (_lock)
{
Build();
Console.WriteLine("Clear");
}
}
impasu nie występuje (lub przynajmniej to, co myślę, LINQ Pad awarii).
Zgodnie z Twoimi odpowiedziami nie powinno to mieć miejsca, ponieważ wciąż jest to ten sam wątek.
Dzięki!
Zobacz http://www.albahari.com/threading/part2.aspx, w sekcji "Zagnieżdżanie blokady". –