Подтвердить что ты не робот

Почему этот код не заторможен?

Не следует ли блокировать метод журнала?

namespace Sandbox {
class Program {
    static void Main(string[] args) {
        var log = new Logger();
        lock (log) {
            log.Log("Hello World!");
        }
    }
}

public class Logger {
    public void Log(string message) {
        lock (this) {
            Console.WriteLine(message);
        }
    }
}

}

4b9b3361

Ответ 1

Тот же поток получает тот же самый замок дважды. Это работает, потому что .NET поддерживает так называемые рекурсивные блокировки (aka повторные мьютексы).

Ответ 2

Если ресурс заблокирован потоком, этот поток разрешен, даже если он уже владеет блокировкой. То же самое верно для этого

Object obj = new Object();

lock(obj) {
    lock(obj) {
        foo();
    }
}

Будет заблокирован, если вы не сможете пройти через тот же поток.

Ответ 3

Простой - вы работаете в одном потоке.