2011-11-09 59 views
4

爲了鎖定我使用一個靜態對象,它是全球我的應用程序:在ASP.NET MVC應用程序中鎖定一個全局對象時可能發生死鎖嗎?

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

使用它在代碼鎖定:

lock(MvcApplication.AppLock) 
{ 
    ... 
} 

讓我們不考慮了一會兒對性能的影響。在這種情況下,我能100%確定我會避免死鎖嗎?

+1

死鎖的定義如L.B下面貼。你確定這就是你所反對的嗎?如果不是,你需要避免什麼情況? –

+0

我想使用這種技術來避免我的應用程序中出現任何類型的死鎖。 – Evgenii

+0

當然,由於我的應用程序中的所有鎖都只使用MvcApplication.AppLock對象。 – Evgenii

回答

12

不能創建一個僵局conditon只是一個鎖定對象(的AppLock)見http://en.wikipedia.org/wiki/Deadlock。但是,有可能用這種代碼的線程

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


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

不知道它在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

相關問題