Возможна ли тупиковая ситуация при блокировке одного глобального объекта в приложении ASP.NET MVC? - PullRequest
4 голосов
/ 09 ноября 2011

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

public class MvcApplication : System.Web.HttpApplication
{        
    public static readonly object AppLock = new object();
    ...
}

Использование его для блокировки в коде:

lock(MvcApplication.AppLock)
{
    ...
}

Давайте на минуту не будем рассматривать влияние на производительность. Могу ли я быть на 100% уверен, что в этом случае я буду избегать тупиковых ситуаций?

Ответы [ 2 ]

12 голосов
/ 09 ноября 2011

Вы не можете создать взаимоблокировку только с одним объектом блокировки (AppLock). См. http://en.wikipedia.org/wiki/Deadlock.Но это возможно с такими кодами в темах

lock(A)
   lock(B)
       DoSomething();


lock(B)
   lock(A)
       DoSomething();
0 голосов
/ 09 марта 2015

Не знаю, возможно ли это в ASP.NET, но в winforms / wpf вы можете это сделать.

'Deadlock' только с одним заблокированным объектом?

Другой сценарий взаимоблокировки возникает при вызове Dispatcher.Invoke (в приложении WPF) или Control.Invoke (в приложении Windows Forms) при наличии блокировки.Если пользовательский интерфейс запускает другой метод, ожидающий той же блокировки, тут же произойдет тупик.Это часто можно исправить, просто вызвав BeginInvoke вместо Invoke.Кроме того, вы можете снять блокировку перед вызовом Invoke, хотя это не сработает, если ваш абонент снял блокировку.Мы объясняем Invoke и BeginInvoke в приложениях Rich Client и Thread Affinity.

source: http://www.albahari.com/threading/part2.aspx

...