Monitor Enter и Exit в C#
Оператор lock компилируется в Monitor.Enter и Monitor.Exit на объекте-синхронизаторе. Те же методы вызывают явно, когда вход и выход нужно расписать самим.
Метод Exit обязательно вызывают в finally: при исключении внутри критической секции монитор иначе останется занятым и другие потоки зависнут навсегда.
Войдём в монитор и выведем метку из защищённой секции. Выход стоит в finally, чтобы монитор освободился даже при ошибке внутри секции:
object gate = new();
Monitor.Enter(gate);
try
{
Console.WriteLine("in"); // выведет "in"
}
finally
{
Monitor.Exit(gate);
}
Войдите в монитор общего объекта, выведите в консоль строку "held" и гарантированно освободите монитор после вывода.