对于锁定,我使用的是一个对我的应用程序来说是全局的静态对象:
public class MvcApplication : System.Web.HttpApplication
{
public static readonly object AppLock = new object();
...
}
使用它来锁定代码:
lock(MvcApplication.AppLock)
{
...
}
让我们暂时不要考虑性能影响。我能100%确定在这种情况下我会避免死锁吗?
答案 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 亲和力。