1

默认情况下静态类构造函数是线程安全的吗?或者它需要明确地使线程安全?

4

2 回答 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 回答