在ASP.NET MVC应用程序中锁定一个全局对象时是否可能出现死锁?

时间:2011-11-09 11:23:24

标签: c# asp.net-mvc asp.net-mvc-3 locking deadlock

对于锁定,我使用的是一个对我的应用程序来说是全局的静态对象:

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

使用它来锁定代码:

lock(MvcApplication.AppLock)
{
    ...
}

让我们暂时不要考虑性能影响。我能100%确定在这种情况下我会避免死锁吗?

2 个答案:

答案 0 :(得分:12)

您无法仅使用一个锁定对象(AppLock)创建死锁条件请参阅http://en.wikipedia.org/wiki/Deadlock。但是在线程中使用这种代码是可能的

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


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

答案 1 :(得分:0)

不知道它是否可以在ASP.NET中使用,但在winforms / wpf中你可以做到。

'Deadlock' with only one locked object?

  

调用Dispatcher.Invoke(in。)时会出现另一个死锁情况   WPF应用程序)或Control.Invoke(在Windows窗体应用程序中)   而拥有一把锁。如果UI碰巧正在运行另一个   正在等待同一个锁的方法,就会发生死锁   那里。这通常可以通过调用BeginInvoke来解决   Invoke。或者,您可以在致电前释放锁   调用,虽然如果你的呼叫者取出锁定,这将无法工作。我们   解释富客户端应用程序和线程中的Invoke和BeginInvoke   亲和力。

来源:http://www.albahari.com/threading/part2.aspx