我有一個字典在靜態構造函數中填充一次,並自此保持不變。我想要多個線程能夠從這個集合中讀取值。我需要在這裏鎖嗎?C#多線程讀取不可修改的集合
回答
According to Microsoft's documentation,只要集合未被修改,Dictionary類可以同時支持多個閱讀器。因此,不需要鎖。
否。只有當您有可能將多個寫入或寫入與讀取交錯時才需要鎖定。只讀,沒有改變就不會引入一個線程正在做什麼影響另一個線程正在做什麼的可能性。
請注意,這根本不需要寫入。比方說,如果你正在使用一個對象並以某種方式修改對象的內部狀態作爲副作用,那麼你需要鎖定它。
雖然這被記錄爲一個特定字典對象的情況,但這通常不適用於字典對象。想象一下,例如,一個字典對象,當你從中讀取字典對象時,它會重新組織它的內部結構,以便將最近讀取的對象移動到哈希桶列表的前面,以便下次讀取時,速度更快。爲編譯器編寫的許多字典都具有此屬性,因爲如果您在「控制檯」內查找「WriteLine」一次,則很可能會再次查找它。這意味着讀取可能導致可能不是線程安全的突變。 – 2010-07-10 15:18:08
@Eric - 公平,真實。我從第二段中刪除了「custom」這個詞,因爲正如你所指出的那樣,許多框架對象也是這樣做的。 – Donnie 2010-07-10 15:28:56
編輯:似乎文檔說這個類是線程安全的閱讀。但是,如果下面的答案仍然沒有適用,因爲你不能認爲你的只讀是隻讀的。
簡短的回答是肯定的。除非班上說它是線程安全的。有很多事情可以做,不是線程安全的。
這很可能不會導致問題,但類可能會以可能導致競爭條件的方式使用內部變量。它也可以調用其他不是線程安全的類。除非你檢查文檔的代碼說沒關係,否則假設是不安全的。
例如,您可能認爲它是隻讀的,但試圖加快速度的類可能會緩存最後訪問的涉及寫入數據的項目。這可能會導致您檢索到不同於預期的項目。
我再次認爲這不太可能,但除非班上說它是線程安全的,否則假設是危險的。
- 1. 多線程修改集合
- 2. 可修改集合集合WSAPI
- 3. 帶只讀修飾符的集合如何在C#中變得可修改?
- 4. 從不可修改的集創建不可修改的集
- 5. 有沒有辦法修改一個不可修改的集合?
- 6. 可變的斯卡拉集合的不可修改的看法
- 7. 多線程訪問集合
- 8. 修改PHP集合
- 9. 修改子集合
- 10. 不可變對象和不可修改集合
- 11. 在按順序讀取時防止集合修改
- 12. 在Foreach循環中修改集合C#
- 13. C#防止集合被修改例外
- 14. 編寫修改了C#集合
- 15. 使用併發詞典 - 線程安全集合修改
- 16. 從修補程序段中讀取多線程
- 17. 儘管我正在修改不同的集合,但獲取「集合已修改」錯誤
- 18. 多線程文件讀取
- 19. 讀取多個線程
- 20. 多線程文件讀取
- 21. 多線程讀取文件
- 22. 多線程MSMQ讀取
- 23. C#讀取和修改Excel單元格
- 24. 修改函數讀取浮動C#
- 25. C#創建/修改/讀取.xlsx文件
- 26. 施放一個不可修改的集合
- 27. 如何返回Java Trove集合的不可修改視圖?
- 28. 修改不可變集合的習慣性方法
- 29. 如何同步不可修改的集合
- 30. 如何創建一個深度不可修改的集合?
不知道爲什麼更多人不檢查文檔。這是每個人都應該看的第一個地方。爲什麼問世界什麼時候可以問問編寫代碼的人? :) +1 – 2010-07-10 13:54:43
@KierenJohnstone原因是因爲人們普遍傾向於有效的方法。這些文件教會了我除了最膚淺的信息之外,不要看它們。我*用*先在那裏尋找這些類型的答案。因爲他們通常不在那裏,所以我不再先看那裏。(我問Google;谷歌把我帶到這裏;我很高興谷歌把我帶到這裏而不是文檔!):) – pettys 2011-11-08 21:06:52
然而,有人注意到文檔中的以下評論 - 在「閱讀是安全的」之後:「即便如此,通過集合枚舉本質上不是一個線程安全的過程。「? – dcg 2012-03-07 10:05:43