2013-06-28 78 views
2

的公共靜態成員(屬性),我有一個樣品靜態類是靜態類線程安全

public static class SampleClass 
    { 
    private static readonly string _personName; 
    private static readonly string _country; 

    static SampleClass() 
    { 
     _personName = "JourneyMan"; 
     _country = "Zee"; 
     System.Threading.Thread.Sleep(5000); 
    } 

    public static string PersonName 
    { 
     get { return _personName; } 
    } 

    public static string Country 
    { 
     get { return _country; } 
    } 
} 

我特意介紹了靜態構造一個Thread.sleep代碼。

我寫了一個示例應用程序,其中兩個線程在ManualResetEvent上等待。我試圖模擬一個線程試圖查詢屬性並執行靜態構造函數並進入睡眠狀態的場景,其他線程是否可以訪問第二個屬性並返回空值?

但根據我所觀察到的,除非構造完成,否則第二個線程無法獲取屬性值。

這是爲我們處理的嗎?或者我做錯了什麼?

那麼我可以假設,在上述情況下,沒有鎖需要確保靜態類的構造完成嗎?

謝謝

+1

任何事情都只是線程安全的,標準AFAIK是你的靜態方法應該是線程安全的。 –

+0

@GrantThomas所以​​我可以假設,除非施工完成,否則不允許線程查詢某個類的屬性? – Sandepku

+1

Eric Lippert在靜態構造函數上做了一系列的工作。第1部分在http://ericlippert.com/2013/02/06/static-constructors-part-one/。值得一讀。而且,是的,在這種情況下不需要鎖。 –

回答

1

在這個例子中你應該是線程安全的。根據the Static Constructors documentation,靜態構造函數'在創建第一個實例或引用任何靜態成員之前自動調用',所以在構造函數完成之前應該無法引用成員。

3

靜態構造函數是線程安全的,靜態屬性no。

靜態構造,保證每個應用程序 域僅一次要運行,創建一類的任何實例之前或任何靜態 成員進行訪問。 http://msdn.microsoft.com/en-us/library/aa645612.aspx

+0

所以我可以假設,除非構造完成(可能由另一個線程),否則不允許線程查詢類的屬性? – Sandepku

+0

是的,的確如此。 –

+0

我對第二個線程是否等待第一個線程從Thread.Sleep出來之前完成構建有懷疑,歡呼聲 – Sandepku