Is deadlock possible when locking one global objec

2019-01-28 04:47发布

问题:

For locking I am using a single static object which is global to my application:

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

Using it for locking in code:

lock(MvcApplication.AppLock)
{
    ...
}

Let us not consider performance impact for a moment. Can I be 100% sure that I will avoid deadlock in this case?

回答1:

You can not create a deadlock conditon just with one lock-object(AppLock) See http://en.wikipedia.org/wiki/Deadlock . But it is possible with this kind of codes in threads

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


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


回答2:

Don't know if it's possible in ASP.NET but in winforms/wpf you can do it.

'Deadlock' with only one locked object?

Another deadlocking scenario arises when calling Dispatcher.Invoke (in a WPF application) or Control.Invoke (in a Windows Forms application) while in possession of a lock. If the UI happens to be running another method that’s waiting on the same lock, a deadlock will happen right there. This can often be fixed simply by calling BeginInvoke instead of Invoke. Alternatively, you can release your lock before calling Invoke, although this won't work if your caller took out the lock. We explain Invoke and BeginInvoke in Rich Client Applications and Thread Affinity.

source: http://www.albahari.com/threading/part2.aspx