【发布时间】:2018-11-06 03:42:41
【问题描述】:
我想我在这里遗漏了一些明显的东西:
为什么这段代码不会导致死锁:
static void Main(string[] args)
{
object _lock1 = new object();
object _lock2 = new object();
Thread code1 = new Thread(() =>
{
lock (_lock1)
{
lock (_lock2)
{
Console.WriteLine("A");
Thread.Sleep(3000);
}
}
});
Thread code2 = new Thread(() =>
{
lock (_lock2)
{
lock (_lock1)
{
Console.WriteLine("B");
Thread.Sleep(3000);
}
}
});
code1.Start();
code2.Start();
code1.Join();
code2.Join();
Console.WriteLine("Done");
}
但是这个可以:
static void Main(string[] args)
{
object _lock1 = new object();
object _lock2 = new object();
Thread code1 = new Thread(() =>
{
lock (_lock1)
{
lock (_lock2)
{
Thread.Sleep(3000);
Console.WriteLine("A");
}
}
});
Thread code2 = new Thread(() =>
{
lock (_lock2)
{
Thread.Sleep(3000);
lock (_lock1)
{
Console.WriteLine("B");
}
}
});
code1.Start();
code2.Start();
code1.Join();
code2.Join();
Console.WriteLine("Done");
}
【问题讨论】:
-
行为未定义。运行几次你可能会得到不同的输出。
-
collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/…(“问题:剖析死锁”)。为什么你的第一个例子没有总是失败?只是因为你很幸运(这通常是具有竞争条件的事物的本质)。
标签: c# multithreading deadlock thread-synchronization