2010-07-10 21 views

回答

14

According to Microsoft's documentation,只要集合未被修改,Dictionary類可以同時支持多個閱讀器。因此,不需要鎖。

+2

不知道爲什麼更多人不檢查文檔。這是每個人都應該看的第一個地方。爲什麼問世界什麼時候可以問問編寫代碼的人? :) +1 – 2010-07-10 13:54:43

+2

@KierenJohnstone原因是因爲人們普遍傾向於有效的方法。這些文件教會了我除了最膚淺的信息之外,不要看它們。我*用*先在那裏尋找這些類型的答案。因爲他們通常不在那裏,所以我不再先看那裏。(我問Google;谷歌把我帶到這裏;我很高興谷歌把我帶到這裏而不是文檔!):) – pettys 2011-11-08 21:06:52

+0

然而,有人注意到文檔中的以下評論 - 在「閱讀是安全的」之後:「即便如此,通過集合枚舉本質上不是一個線程安全的過程。「? – dcg 2012-03-07 10:05:43

2

否。只有當您有可能將多個寫入或寫入與讀取交錯時才需要鎖定。只讀,沒有改變就不會引入一個線程正在做什麼影響另一個線程正在做什麼的可能性。

請注意,這根本不需要寫入。比方說,如果你正在使用一個對象並以某種方式修改對象的內部狀態作爲副作用,那麼你需要鎖定它。

+0

雖然這被記錄爲一個特定字典對象的情況,但這通常不適用於字典對象。想象一下,例如,一個字典對象,當你從中讀取字典對象時,它會重新組織它的內部結構,以便將最近讀取的對象移動到哈希桶列表的前面,以便下次讀取時,速度更快。爲編譯器編寫的許多字典都具有此屬性,因爲如果您在「控制檯」內查找「WriteLine」一次,則很可能會再次查找它。這意味着讀取可能導致可能不是線程安全的突變。 – 2010-07-10 15:18:08

+0

@Eric - 公平,真實。我從第二段中刪除了「custom」這個詞,因爲正如你所指出的那樣,許多框架對象也是這樣做的。 – Donnie 2010-07-10 15:28:56

1

編輯:似乎文檔說這個類是線程安全的閱讀。但是,如果下面的答案仍然沒有適用,因爲你不能認爲你的只讀是隻讀的。


簡短的回答是肯定的。除非班上說它是線程安全的。有很多事情可以做,不是線程安全的。

這很可能不會導致問題,但類可能會以可能導致競爭條件的方式使用內部變量。它也可以調用其他不是線程安全的類。除非你檢查文檔的代碼說沒關係,否則假設是不安全的。

例如,您可能認爲它是隻讀的,但試圖加快速度的類可能會緩存最後訪問的涉及寫入數據的項目。這可能會導致您檢索到不同於預期的項目。

我再次認爲這不太可能,但除非班上說它是線程安全的,否則假設是危險的。

+0

這是否意味着如果我更改了Dictionary中包含的對象的某些屬性,我可以得到一個異常? – 2010-07-10 13:44:32

+0

您應該徹底測試,但即使它們未被標記爲「線程安全」,也可以安全地同時讀取許多集合。假設它是危險的,可能會導致性能下降,絕對沒有收益。 – Donnie 2010-07-10 14:04:27

+0

@ user375487:你不可能不會得到異常,但你會得到奇怪的行爲。您應該鎖定正在更改的對象,因爲可能有多個線程可能會同時嘗試更改它。 – Donnie 2010-07-10 14:05:09