2012-05-17 14 views
5

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!

+1

Zobacz http://www.albahari.com/threading/part2.aspx, w sekcji "Zagnieżdżanie blokady". –

Odpowiedz

8

W języku C# wątek z blokadą może wejść do tej samej blokady bez blokowania.

Instrukcja lock, a także Monitor class, na której jest zbudowany, to reentrant w .NET.


Edit w odpowiedzi na EDIT:

Po dodaniu wywołanie Build wewnątrz jasne, kod nie impasu - to woła się rekurencyjnie. To nie blokowanie, ale raczej działa zawsze (aż w końcu trafisz StackOverflowException), ponieważ Build rozmowy Clear który zwraca Build ponownie która wzywa Clear, etc ....

+0

Jeśli chodzi o moją edycję, naprawdę nie wiem, jak tego nie widziałem. Dziękuję za obie odpowiedzi! – stacker

4

Nie będę, ponieważ jasne jest wywoływane w ramach tego samego wątku, który już zastosował blokadę.

5

Dokumentacja lock mówi:

Jeśli inny wątek próbuje wprowadzić zablokowany kod, będzie czekać (zablokować), aż obiekt zostanie zwolniony.

Kluczowym słowem jest "inny". Wątek nie blokuje się, tylko inne wątki. Jeśli inny wątek posiadałby blokadę, blokowałby się wtedy lock.

To oszczędza wiele bólów głowy.

Powiązane problemy