static void Main(string[] args)
        {
            Task.Run(()=> Method1());
            Task.Run(() => Method2());
            Console.Read();
        }
        static void Method1()
        {
            lock (obj1)
            {
                Console.WriteLine("开始执行方法一");
                Thread.Sleep(1000);
                lock (obj2)
                {
                    Console.WriteLine("方法一执行完毕");
                }
            }
        }
        static void Method2()
        {
            lock (obj2)
            {
                Console.WriteLine("开始执行方法二");
                Thread.Sleep(1000);
                lock (obj1)
                {
                    Console.WriteLine("方法二执行完毕");
                }
            }
        }结果如下,这两个方法永远都不会执行完毕
3.那么,死锁应该怎么样解决呢?
        private static readonly object obj1 = new object();
        private static readonly object obj2 = new object();
        static void Main(string[] args)
        {
            Task.Run(()=> Method1());
            Task.Run(() => Method2());
            Console.Read();
        }
        static void Method1()
        {
            try
            {
                if (Monitor.TryEnter(obj1, 5000))
                {
                    Console.WriteLine("开始执行方法一");
                    Thread.Sleep(1000);
                    bool locked = false;
                    try
                    {
                        Monitor.TryEnter(obj2, 5000, ref locked);
                        Console.WriteLine("方法一执行完毕");
                    }
                    finally
                    {
                        if (locked)
                        {
                            Monitor.Exit(obj2);
                        }
                    }
                }
            }
           finally
            {
                Monitor.Exit(obj1);
            }
        }
        static void Method2()
        {
            try
            {
                if (Monitor.TryEnter(obj2, 5000))
                {
                    Console.WriteLine("开始执行方法二");
                    Thread.Sleep(1000);
                    bool locked=false;
                    try
                    {
                        Monitor.TryEnter(obj1, 5000,ref locked);
                        Console.WriteLine("方法二执行完毕");
                    }
                    finally
                    {
                        if (locked)
                        {
                            Monitor.Exit(obj1);
                        }
                    }
                }
            }
            finally
            {
                Monitor.Exit(obj2);
            }
        }
这样,即使在两个线程都在互相等待资源的情况下,利用超时机制,依然能够使他们放弃当前锁,保证解决死锁问题。
原文:https://www.cnblogs.com/fxw883721/p/14211114.html