我正在愉快地阅读Eric Lippert的这篇文章,当然还有其中很好的评论,在其中John Payson说:
更有趣的例子可能是使用两个静态类,因为这样的程序可以在没有任何可见的阻塞语句的情况下发生死锁。
我想,是啊,那很容易实现,所以我写了这个东西:
public static class A
{
static A()
{
Console.WriteLine("A.ctor");
B.Initialize();
Console.WriteLine("A.ctor.end");
}
public static void Initialize()
{
Console.WriteLine("A.Initialize");
}
}
public static class B
{
static B()
{
Console.WriteLine("B.ctor");
A.Initialize();
Console.WriteLine("B.ctor.end");
}
public static void Initialize()
{
Console.WriteLine("B.Initialize");
}
public static void Go()
{
Console.WriteLine("Go");
}
}
调用 B.Go()
后的输出为:
B.ctor
A.ctor
B.Initialize
A.ctor.end
A.Initialize
B.ctor.end
Go
没有死锁,我显然是个失败者-为了让尴尬永恒,这里是我的问题:为什么这里没有死锁?
在我微小的大脑中,似乎在B
的静态构造函数完成之前调用了B.Initialize
,我认为这是不允许的。