如果我在Thread.Sleep(0)
方法中评论或传递0,那么就没有死锁。在其他情况下,存在僵局。 uptask
由线程轮询中的线程执行,并且需要一些时间。同时,主线程获取lockB,lockA并打印字符串并释放锁。之后uptask
开始运行,它看到lockA和lockB是空闲的。所以在这种情况下没有死锁。但是如果我在睡眠主线程的同时uptask
前进,并看到lockB被锁定并发生死锁。任何人都可以更好地解释或验证这是否是原因?使用Thread.Sleep解决锁定死锁
class MyAppClass
{
public static void Main()
{
object lockA = new object();
object lockB = new object();
var uptask = Task.Run(() =>
{
lock (lockA)
{
lock (lockB)
{
Console.WriteLine("A outer and B inner");
}
}
});
lock (lockB)
{
//Uncomment the following statement or sleep with 0 ms and see that there is no deadlock.
//But sleep with 1 or more lead to deadlock. Reason?
Thread.Sleep(1);
lock (lockA)
{
Console.WriteLine("B outer and A inner");
}
}
uptask.Wait();
Console.ReadKey();
}
}
这不是生产代码,我只是在做实验。为什么在我的环境中睡1秒会造成死锁,如果没有睡眠,就没有死锁?我试图找到答案。 – RotatingWheel
@RotatingWheel,看我的更新 –