2012-06-16 34 views
2

例如,我可以去:正在訪問Dictionary <TKey,TValue> Keys屬性線程安全嗎?

string[] keys = new string[items.Count]; 
items.Keys.CopyTo(keys); 

如果項目是:可能被另一個線程正在修改

Dictionary<string, MyObject> 

實例? (它不清楚,如果當訪問Keys屬性時,Dictionary的內部工作會迭代集合 - 在這種情況下,我知道它不會是線程安全的)。

更新:我意識到我的上述示例不是線程安全的,因爲Dictonary的大小可能會在行之間改變。然而如何:

Dictionary<string, MyObject> keys = items.Keys; 
string[] copyOfKeys = new string[keys.Count]; 
keys.Keys.CopyTo(copyOfKeys); 

回答

3

不,Dictionary是不是線程安全的。如果您需要線程安全並且您使用的是.NET 4或更高版本,則應該使用ConcurrentDictionary

從MSDN:

詞典可以支持多個讀者同時, 只要集合不會被改動。儘管如此,通過集合枚舉 本質上不是一個線程安全的過程。在枚舉與寫入訪問競爭的罕見情況下, 集合必須在整個枚舉期間被鎖定。爲了允許多個線程訪問 集合進行讀取和寫入,您必須實現自己的同步。

+0

我知道字典不是線程安全的 - 這是否意味着訪問Keys屬性不是線程安全的? (我認爲只是意味着迭代和修改不是線程安全的)。 – markmnl

+0

根據MSDN,由Keys屬性返回的集合是對Dictionary的鍵的引用,因此在集合被修改時它可能會突然更改。 –

1

如果字典正在另一個線程上進行變異,那麼執行此操作並不安全。首先想到的是字典可能調整其內部緩衝區,這肯定無法在併發迭代中很好地發揮作用。

如果你沒有改變鑰匙,只寫值,這應該在實踐中是安全的。

無論如何,我不會把這樣的代碼投入生產,因爲風險太高。如果某個.NET補丁更改了Dictionary的內部結構,並且突然出現了錯誤,該怎麼辦?還有其他問題。

我建議你使用ConcurrentDictionary或其他一些安全策略。爲什麼賭你的代碼的正確性?

相關問題