2012-12-03 81 views
7

我正在尋找從多個線程訪問的只讀字典。雖然ConcurrentDictionary公開了這樣的功能,但我不想擁有開銷和奇怪的API。爲什麼ReadOnlyDictionary不是線程安全的?

.net 4.5雖然提供了這樣一個類,文檔指出只有靜態調用是安全的。

我想知道爲什麼?

+0

複製: 線程安全 ConcurrentDictionary所有的公共和保護成員中是線程安全的,並且可以從多個線程同時使用。 –

+3

@KenCheung:目前尚不清楚爲什麼你的評論是相關的。這個問題表明OP已經知道'ConcurrentDictionary <,>',但詢問'ReadOnlyDictionary <,>'的安全性。 –

回答

8

ReadOnlyDictionary只是其他任何字典的包裝。因此,它只是與底層字典一樣是線程安全的。

特別是,如果在另一個線程從包裝器讀取時有線程修改底層字典,則不能保證安全。

如果你想有一個ReadOnlyDictionary這是從所有角度有效一成不變的,你可以創建原始字典的克隆,創建一個圍繞一個ReadOnlyDictionary包裝,再不能保持到克隆的引用的任何地方。只有只有讀操作正在進行,它應該是線程安全的。當然,如果關鍵字或值類型是可變的,那麼會引發第二種程度的「線程不安全」擔心。從微軟的文檔

+0

我也這麼認爲。謝謝。 – Mouk

+3

只是一個澄清。只讀並不意味着線程安全。如果字典根據讀取的使用情況重新排列項目,該怎麼辦? BCL字典不會這樣做(AFAIK),但是我在某處讀到Scripting.Dictionary將最後一個讀取的項目移動到存儲區中的第一個位置。 – adrianm

+1

@adrianm:是的,那是真的。但是你可以包裝一個從未被修改過的'System.Collections.Generic.Dictionary',*那*就沒問題。 –

相關問題