Sample code to illustrate a deadlock by using lock(this)

前端 未结 6 1167
我在风中等你
我在风中等你 2020-12-23 20:57

I\'ve read several articles and posts that say that lock(this), lock(typeof(MyType)), lock(\"a string\") are all bad practice because

6条回答
  •  佛祖请我去吃肉
    2020-12-23 21:49

    Sure, here you go.

    Note that the common example for a deadlock is when you acquire multiple locks, and two or more threads end up waiting for each other.

    For instance, two threads that locks like this:

    Thread 1               Thread 2
     Lock "A"               Lock "B"
     Lock "B"               Lock "A" <-- both threads will stop dead here
                                         waiting for the lock to be come
                                         available.
    

    However, in this example I didn't bother with that, I just let one thread lock indefinitely. You really don't want to loose control over your locks, so while this is a contrived example, the fact that the background thread can completely block the main thread like this, is bad.

    using System;
    using System.Threading;
    
    namespace ConsoleApplication7
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                LockableClass lockable = new LockableClass();
                new Thread(new ParameterizedThreadStart(BackgroundMethod)).Start(lockable);
                Thread.Sleep(500);
                Console.Out.WriteLine("calling Reset");
                lockable.Reset();
            }
    
            private static void BackgroundMethod(Object lockable)
            {
                lock (lockable)
                {
                    Console.Out.WriteLine("background thread got lock now");
                    Thread.Sleep(Timeout.Infinite);
                }
            }
        }
    
        public class LockableClass
        {
            public Int32 Value1 { get; set; }
            public Int32 Value2 { get; set; }
    
            public void Reset()
            {
                Console.Out.WriteLine("attempting to lock on object");
                lock (this)
                {
                    Console.Out.WriteLine("main thread got lock now");
                    Value1 = 0;
                    Value2 = 0;
                }
            }
        }
    
    }
    

提交回复
热议问题