2012-09-11 55 views
1

默认情况下是静态类构造函数threadsafe?或者它需要明确做出线程安全?线程安全静态类和构造函数

+3

http://stackoverflow.com/questions/7095/is-the-c -sharp静态构造函数线程安全 –

回答

4

CLR保证静态构造函数将在AppDomain的整个生命周期中仅被调用一次。它将被称为第一次访问静态成员或创建实例。而且由于每个AppDomain仅被调用一次,所以您可以放心地假设只有一个线程可以调用它。

0

如果通过线程安全,你的意思是“它只会被调用一次吗?”,那么答案是肯定的。但是,CLR通过全局锁定来阻止多个线程调用静态构造函数。这意味着如果你做了一些事情会导致另一个线程尝试获取该锁(例如,通过调用类的静态方法),那么就有可能发生死锁。

例如,下面的程序死锁(从埃里克利珀我似乎,但不能找到一个参考):

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