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?
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();
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