2012-09-11 87 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() { } 
}