c#中存在死锁吗?



我有下面的代码,当然我有一个死锁使用线程,但为什么不发生与任务?

private static object lockObject1 = new object();
private static object lockObject2 = new object();
static void Main(string[] args)
{
Console.Title = "Deadlocks";
//Using tasks.
Task ourTask1 = new Task(SingleMethod_A);
ourTask1.Start();
Task ourTask2 = new Task(SingleMethod_B);
ourTask2.Start();
//Using threads.
//Thread ourThread1 = new Thread(new ThreadStart(SingleMethod_A));
//Thread ourThread2 = new Thread(new ThreadStart(SingleMethod_B));
//ourThread1.Start();
//ourThread2.Start();
Console.WriteLine("Deadlock");
}
public static void SingleMethod_A()
{
lock (lockObject1)
{
Thread.Sleep(1000); 
lock (lockObject2)
{
Console.WriteLine("not possible.");
}
}
}
public static void SingleMethod_B()
{
lock (lockObject2)
{
Thread.Sleep(1000); 
lock (lockObject1)
{
Console.WriteLine("not possible.");
}
}
}

Task当然可以死锁。同样重要的是要记住,Task不是线程——它们可能运行在线程池中的一个线程上。

为什么你没有看到它是因为你的情况是一个微不足道的例子和.Start不需要使用单独的线程。尝试将调用改为启动Task.Run(action),以查看死锁:

Task.Run(() => SingleMethod_A());
Task.Run(() => SingleMethod_B());

最新更新