所以我很高兴地从 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.Initialize
调用我的小大脑,我认为这是不允许的。B