.Net4, Monitor.Enter(lockObject, приобрелLock)

В .Net4 Monitor.Enter(Object) помечен как устаревший:

[ObsoleteAttribute("This method does not allow its caller to reliably release the lock.  Please use an overload with a lockTaken argument instead.")]
public static void Enter(
    Object obj
)

И есть новый метод Monitor.Enter(lockObject, ПриобретенныйLock ) с таким использованием:

bool acquiredLock = false;

try
{
    Monitor.Enter(lockObject, ref acquiredLock);

    // Code that accesses resources that are protected by the lock.

}
finally
{
    if (acquiredLock)
    {
        Monitor.Exit(lockObject);
    }
}

Раньше я делал это так:

Monitor.Enter(lockObject);
try
{

    // Code that accesses resources that are protected by the lock.
}
finally
{
    Monitor.Exit(lockObject);
}

Это неправильно ? Почему ? Может быть, с прерыванием после ввода, но перед попыткой?
Как спросил Эймон Нербонн: что произойдет, если возникнет асинхронное исключение в finally прямо перед monitor.exit?

Ответ: ThreadAbortException

Когда возникает это исключение, среда выполнения выполняет все блоки finally перед завершением потока.


person Guillaume    schedule 23.10.2009    source источник
comment
Что произойдет, если возникнет асинхронное исключение в finally прямо перед monitor.exit?   -  person Eamon Nerbonne    schedule 28.01.2010
comment
Я не знаю о других асинхронных исключениях, но CLR не позволяет прерывать исключения прерывания блоков finally, а другие асинхронные исключения в любом случае с большей вероятностью остановят процесс.   -  person Jon Skeet    schedule 05.03.2010


Ответы (1)


Как вы предполагаете в самом конце вопроса, проблема в том, что асинхронное исключение может быть вызвано после вызова Monitor.Enter, но до того, как вы войдете в блок try.

Новый способ ведения дел гарантирует, что что бы ни случилось, вы попадете в блок finally и сможете снять блокировку, если вы ее установили. (Вы не можете получить его, например, если Monitor.Enter выдает исключение.)

IIRC, это новое поведение ключевого слова lock при нацеливании на .NET 4.0.

person Jon Skeet    schedule 23.10.2009
comment
Да, замок был изменен, чтобы использовать новую конструкцию (по крайней мере, так было в бета-версии 1). - person Brian Rasmussen; 23.10.2009
comment
Я приму ответ, если вы сможете ответить на вопрос Эймона Нербонна;) - person Guillaume; 05.03.2010