线程安全静态类和构造函数

时间:2012-09-11 05:44:47

标签: c# multithreading static

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

2 个答案:

答案 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() { }
}