杰弗里里希特在他的书"CLR via C#"中指出了我不理解的可能死锁的例子(第702页,边框段落).
该示例是一个运行Task并为此Task调用Wait()的线程.如果未启动任务,则Wait()调用可能不会阻塞,而是运行未启动的任务.如果在Wait()调用之前输入了锁,并且Task也尝试输入此锁,则可能导致死锁.
但是锁是在同一个线程中输入的,如果这最终导致死锁情况?
以下代码生成预期输出.
class Program
{
static object lockObj = new object();
static void Main(string[] args)
{
Task.Run(() =>
{
Console.WriteLine("Program starts running on thread {0}",
Thread.CurrentThread.ManagedThreadId);
var taskToRun = new Task(() =>
{
lock (lockObj)
{
for (int i = 0; i < 10; i++)
Console.WriteLine("{0} from Thread {1}",
i, Thread.CurrentThread.ManagedThreadId);
}
});
taskToRun.Start();
lock (lockObj)
{
taskToRun.Wait();
}
}).Wait() ;
}
}
/* Console output
Program starts running on thread 3
0 from Thread 3 …
Run Code Online (Sandbox Code Playgroud)