C#:为什么其中一个线程示例陷入僵局而另一个没有?

时间:2015-08-05 19:37:05

标签: c# multithreading

以下代码将锁定:

static void Main()
{
    object lockA = new object();
    object lockB = new object();
    var up = Task.Run(() =>
    {
        lock (lockA)
        {
            Thread.Sleep(1000);
            lock (lockB)
            {
                Console.WriteLine("Here1");
            }
        }
    });
    var down = Task.Run(() =>
    {
        lock (lockB)
        {
            lock (lockA)
            {
                Console.WriteLine("Here2");
            }

        }
    });
    up.Wait();
    Console.ReadLine();
}

但是这段代码取自C#.NET 70-483一书并未锁定在调试模式下运行的Visual Studio 2013中。

static void Main()
        {
            object lockA = new object();
            object lockB = new object();
            var up = Task.Run(() =>
            {
                lock (lockA)
                {
                    Thread.Sleep(1000);
                    lock (lockB)
                    {
                        Console.WriteLine("Here1");
                    }
                }
            });
            lock (lockB)
            {
                lock (lockA)
                {
                    Console.WriteLine("Here2");
                }

            }
            up.Wait();
            Console.ReadLine();
        }

主要运行的线程是否有特殊之处,或者在实现中是否有一些我无法看到的简单细节。它在这里没有说什么:https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx这会给我一个关于原因的指示。

我唯一的另一个想法是" up"产生了一些具有进入锁定的特殊能力?如果这就是为什么允许你的代码这么重要的原因?

1 个答案:

答案 0 :(得分:1)

它只是随机的时间;在第二个例子中,第二个打印周围的两个锁定都可能在第一个任务的线程有时间启动之前输入。在最后Thread.Sleep(500)之前添加lock (lockB),您可能也会看到它锁定。