Ответ 1
Тот же поток получает тот же самый замок дважды. Это работает, потому что .NET поддерживает так называемые рекурсивные блокировки (aka повторные мьютексы).
Не следует ли блокировать метод журнала?
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);
}
}
}
}
Тот же поток получает тот же самый замок дважды. Это работает, потому что .NET поддерживает так называемые рекурсивные блокировки (aka повторные мьютексы).
Если ресурс заблокирован потоком, этот поток разрешен, даже если он уже владеет блокировкой. То же самое верно для этого
Object obj = new Object();
lock(obj) {
lock(obj) {
foo();
}
}
Будет заблокирован, если вы не сможете пройти через тот же поток.
Простой - вы работаете в одном потоке.