【问题标题】:Is deadlock possible when locking one global object in ASP.NET MVC application?在 ASP.NET MVC 应用程序中锁定一个全局对象时是否可能出现死锁?
【发布时间】:2011-11-09 11:23:23
【问题描述】:

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

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

用它来锁定代码:

lock(MvcApplication.AppLock)
{
    ...
}

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

【问题讨论】:

  • 死锁的定义如下 L.B 所示。你确定这是你要防范的吗?如果不是,你需要避免什么情况?
  • 我想使用这种技术来避免我的应用程序中出现任何类型的死锁。
  • 当然,鉴于我的应用程序中的所有锁都只使用 MvcApplication.AppLock 对象。
  • 那么我认为您不了解死锁。如果您要添加 lock 来消除死锁,那么您不明白对于死锁,您需要从两个 locks 开始。还是您在谈论 SQL Server 死锁,有什么不同?
  • 哦,很抱歉造成混乱。我的意思是我的 Web 应用程序中有不止一个锁块,实际上很多。我只是想确保它在任何情况下都不会死锁。是的,我的意思只是我在 asp.net mvc 项目中的 C# 代码,而不是 sql 死锁。

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


【解决方案1】:

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

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


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

【讨论】:

    【解决方案2】:

    不知道在 ASP.NET 中是否可行,但在 winforms/wpf 中可以。

    'Deadlock' with only one locked object?

    调用 Dispatcher.Invoke(在 WPF 应用程序)或 Control.Invoke(在 Windows 窗体应用程序中) 在拥有一把锁的时候。如果 UI 碰巧正在运行另一个 等待同一个锁的方法,死锁会发生 那里。这通常可以通过调用 BeginInvoke 来解决 的调用。或者,您可以在调用之前释放您的锁 调用,尽管如果您的调用者取出锁,这将不起作用。我们 解释富客户端应用程序和线程中的 Invoke 和 BeginInvoke 亲和力。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      相关资源
      最近更新 更多