默认情况下,静态类构造函数是否安全?或者它需要明确地使线程安全吗?
答案 0 :(得分:4)
CLR保证在AppDomain的整个生命周期内只调用一次静态构造函数。它将在第一次访问静态成员或创建实例时调用。因为每个AppDomain只调用一次,所以你可以安全地假设只有一个线程可以调用它。
答案 1 :(得分:0)
如果通过线程安全,你的意思是“它只会被调用一次吗?”,那么答案是肯定的。但是,CLR通过采用全局锁来防止多个线程调用静态构造函数来实现此目的。这意味着如果你做了一些会导致另一个线程尝试获取该锁的东西(例如通过在类上调用静态方法),那么就有可能出现死锁。
例如,以下程序死锁(来自Eric Lippert,但我似乎无法找到参考):
public class Program
{
static Program()
{
Thread thread = new Thread(Test);
thread.Start();
thread.Join();
}
public static void Main(string[] args)
{
Console.WriteLine("Hello, world!");
}
static void Test() { }
}