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

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

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

用它来锁定代码:

 lock(MvcApplication.AppLock) { ... } 

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

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

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

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

‘死锁’只有一个被锁定的物体?

在拥有锁时调用Dispatcher.Invoke(在WPF应用程序中)或Control.Invoke(在Windows窗体应用程序中)时会出现另一种死锁情况。 如果UI碰巧正在运行另一个等待同一个锁的方法,那么就会发生死锁。 这通常可以通过调用BeginInvoke而不是Invoke来解决。 或者,您可以在调用Invoke之前释放锁定,但如果调用者取消锁定,则无法执行此操作。 我们在Rich Client Applications和Thread Affinity中解释Invoke和BeginInvoke。

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