所以我有Dictionary<string, SomeClass>
這將被多個併發線程嚴重訪問 - 有些人會寫,大部分都會閱讀。沒有鎖定,沒有同步 - 工作線程不會進行檢查 - 只需讀取或寫入。唯一的保證是沒有兩個線程將使用相同的密鑰寫入值。問題是這種數據結構是否會以這種方式被破壞?通過損壞我的意思是不工作了,即使只有一個線程。字典(的TKey,TValue)併發訪問:最糟糕的場景
回答
最壞情況的方案包括:
的NullReferenceException或IndexOutOfRangeException拋出一個字典<,>方法的。
任意數量的數據丟失。如果兩個線程試圖同時調整字典<>>表,他們可以跺腳,擰緊,並丟失數據。
錯誤的答案返回通過從字典<,>讀。
基本上,字典<,>可以做任何事情壞的,你能想到的,由CLR所施加的限制之內。據推測,你仍然不會像使用本地編程語言那樣破壞類型安全或破壞堆。也許,反正:-)
這樣的數據結構可能會被破壞嗎?
是的,很可能你會得到一個IndexOutOfRange或類似的異常。
即使您捕捉並忽略異常,您也不會再獲得可靠的數據。重複和缺失值都是可能的。
所以不要這樣做。
+1。特別是,從文檔(http://msdn.microsoft.com/en-us/library/xfhwa508.aspx):「字典(TKey,TValue)可同時支持多個閱讀器,只要該集合未被修改即使如此,通過集合枚舉本質上不是一個線程安全的過程,在枚舉與寫入訪問爭奪的罕見情況下,集合必須在整個枚舉過程中被鎖定,以允許集合被多個線程訪問閱讀和寫作,你必須實現你自己的同步。「 – 2012-02-15 21:19:23
如果您正在訪問從多個線程的集合,這將是最安全的方法是.NET 4的線程安全的品種之一,如ConcurrentDictionary
- 1. ConcurrentDictionary <TKey,TValue> VS字典<TKey,TValue>
- 2. 不可變的字典<TKey,TValue>
- 3. 如何獲得給定類型的TKey和TValue字典<TKey,TValue>類型
- 4. 創建擴展方法TryGetValue可枚舉的(TKEY的,出TValue)<KeyValuePair <TKEY的,TValue >>就像字典的<TKEY的,TValue>中
- 5. 轉換字典<TKEY的,列表<TValue>>到ReadOnlyDictionary <TKEY的,ReadOnlyCollection <TValue>>
- 6. 糟糕的畫布背景
- 7. 繼承字典(的TKey,TValue)不能不區分大小寫
- 8. 通用字典中的TKey和TValue是什麼?
- 9. .net中字典<TKey,TValue>的基礎數據結構.net
- 10. 如何從C#中的TKey獲取字典TValue?
- 11. 什麼是WPF最糟糕的問題?
- 12. 類ObservableDictionary <TKEY的,TValue>中:IDictionary的<TKEY的,TValue>中的DataContract
- 13. 最糟糕的SQL有
- 14. 在隔離存儲中存儲字典<TKey,TValue>
- 15. C#字典<TKey,TValue>是否保證迭代順序?
- 16. 反序列化xml字典<TKey,TValue>與DataContactSerializer
- 17. 序列化字典<TKey,TValue>與JSON與DataContractJsonSerializer
- 18. 默認情況下按字典<TKey,TValue>排序嗎?
- 19. 如何在VB.NET中直接填寫字典(TKey,TValue)
- 20. pci_disable_msi糟糕問題
- 21. 角色對象到詞典<TKEY的,TValue>中
- 22. C#中的泛型,詞典<TKey,TValue>
- 23. 字典<TKey,TValue>:TValue的確切類型取決於你放入的內容
- 24. 爲什麼不能/不能IDictionary <TKey,TValue>實施ILookup <TKey,TValue>?
- 25. 字典<TKey,TValue>比列表上的LINQ更快<T>?
- 26. KeyValuePair <TKey,TValue> - 成員字段問題
- 27. 這個詞典如何<TKey,TValue>例外成爲可能?
- 28. 如何靜態分配詞典<TKey,TValue>值
- 29. 糟糕的表現
- 30. FormData糟糕的泡菜(發現錯誤)
你是什麼意思*沒有再工作*? – Yuck 2012-02-15 21:12:18
@Yuck嗯,拋出一些怪異的例外,而執行正常的操作或類似的東西。 Msdn只說「不是線程安全的」,而沒有詳細說明。這是否意味着腐敗的可能性或操作的非原子性? – ren 2012-02-15 21:17:00
「不是線程安全的」不需要更多細節,通常很難列出所有可能的錯誤。真正討厭的只發生一年一次左右。很好,當你必須找到/ repro他們。 – 2012-02-15 21:21:53