Почему этот код не блокируется?

Я ожидаю, что следующий код заблокируется, когда Clear попытается заблокировать тот же объект, который уже заблокирован Build:

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");
        }
    }
}

Вывод:

Clear

Build

Edit 1

Всем спасибо за ответы.

Если я добавлю вызов Build внутри блокировки Clear (оставив остальную часть кода без изменений):

public void Clear()
{
    lock (_lock)
    {
        Build();

        Console.WriteLine("Clear");
    }
}

Взаимная блокировка действительно возникает (или, по крайней мере, я так думаю, происходит сбой LINQ Pad).

Судя по вашим ответам, этого быть не должно, потому что это все та же ветка.

Спасибо!

5
задан stacker 17 May 2012 в 18:06
поделиться