2009-04-29 77 views
1

閱讀msdn documentation它爲字典說:「此類型的公共靜態(Visual Basic中的共享)成員是線程安全的。任何實例成員不保證線程安全。.Net中的靜態字典線程安全

那些這意味着,藉助字典像這樣:


static object syncObject = new object(); 
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>(); 

做類似下面不必要的代碼?


lock (syncObject) 
{ 
    context = new TDataContext(); 
    mydictionary.Add("key", myObject); 
} 

回答

7

它指的是類本身的靜態方法。該聲明實際上是添加到大多數類的樣板文檔。字典<>類實際上並不公開任何靜態方法。

您必須使用lock關鍵字或者甚至ReaderWriterLock來自行序列化您的字典類的訪問權限。線程雖然是一個相當複雜的話題,但鎖關鍵字並不總是合適的。 Joe Duffy撰寫的一本很棒的書「Concurrent Programming on Windows」深入探討了共享應用程序資源的保護問題。

1

這意味着如果調用Add方法(實例方法),最好通過使用自己的鎖定或序列化語義來確保您擁有對Dictionary的獨佔訪問權限。如果兩個線程同時修改您的Dictionary的狀態,則可能會發生錯誤,並且確保這不會發生是您的責任。 Dictionary的Add方法中沒有任何內容會爲你鎖定。

但是,如果你在Dictionary上調用一些靜態方法(其中沒有任何有用的方法),那麼你會沒事的沒有鎖。

這是BCL中所有.NET類型的一般規則。

2

你誤解了「公共靜態成員此類型的」爲「公共靜態情況下,這種類型的」。