默认情况下静态类构造函数是线程安全的吗?或者它需要明确地使线程安全?
问问题
468 次
2 回答
4
CLR 保证静态构造函数在 AppDomain 的整个生命周期内只被调用一次。首次访问静态成员或创建实例时将调用它。由于每个 AppDomain 只调用一次,您可以放心地假设只有一个线程可以调用它。
于 2012-09-11T05:46:33.693 回答
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() { }
}
于 2012-09-11T07:12:52.463 回答