【发布时间】:2015-04-08 06:28:56
【问题描述】:
这个谜题是在 NDC 2010 上展示的。那里有视频链接,但它们都坏了。我不明白这个程序的行为;为什么会挂起?
class Woot
{
private static float PI;
private static bool initialized = doInitialize();
private static bool doInitialize()
{
if (!initialized)
{
var thread = new Thread(() => { PI = 3.14f; });
thread.Start();
thread.Join(); // here
}
return true;
}
public static void Main(string[] args)
{
Console.WriteLine(PI);
}
}
这个程序的输出是什么?是吗:
- 3.14
- 0
- 抛出异常
- 以上都不是
【问题讨论】:
-
@Sayse,你的意思是当线程试图使用元数据类型对象时还没有构造它?这是我的猜测。
-
@Yola - 你可能想把“而且我无法理解程序的行为。它挂起。”在结束你的问题是不要放弃游戏。 :)
-
@poke 那是一个完全不同的问题。即使另一个问题的作者打算问同样的问题 - 这个问题更清楚。
-
@Sebastian 那里的 answer 解释了这个问题。
-
我在这篇博文中解释了发生了什么:ericlippert.com/2013/01/31/the-no-lock-deadlock。顺便说一句,这个谜题改编自尼尔关于 Java 谜题的书中的一个非常相似的谜题。 Java 在运行静态初始化时具有相同的行为。
标签: c#