由於MSDN saysConcurrentDictionary <TKey,TValue> VS字典<TKey,TValue>
ConcurrentDictionary<TKey, TValue>
類表示可以由多個線程同時訪問的鍵值對的線程安全集合。
但我知道,System.Collections.Concurrent
類是專爲PLINQ。
我有Dictionary<Key,Value>
這使上線的客戶端服務器,我讓線程通過鎖定目標,當我有機會獲得它的安全。
我可以放心地在我的情況下ConcurrentDictionary<TKey,TValue>
更換Dictionary<TKey,TValue>
?更換後性能會有所提高嗎?
Here在第5部分約瑟夫阿爾巴哈利提到,它設計成用於並行編程
- 的併發集合被調諧爲並行編程。除了高度併發的場景外,傳統系列的表現都優於它們。
- 線程安全的集合不保證使用它的代碼是線程安全的。
- 如果枚舉一個併發收集,而另一個線程正在修改它,則不會拋出異常。相反,您會混合使用新舊內容。
- List沒有併發版本。
- 併發堆棧,隊列和包類是內部實現的鏈表。這使得它們的內存效率低於非併發棧和隊列類,但對於併發訪問更好,因爲鏈表有利於鎖定免費或低鎖的實現。 (這是因爲插入節點到鏈表需要更新,只是一對夫婦的參考,同時將元素插入一個列表狀結構可能需要移動目前數以千計的元素。)
我不知道System.Collections.Concurrent類是「爲PLINQ設計的」這個事實 - 你從哪裏得到這個想法? – BrokenGlass 2011-03-14 19:38:52
@BrokenGlass:也許在lambda和匿名類型是「爲LINQ設計」的意義上;他們由於* LINQ而成爲框架*,但他們肯定具有超越它的適用性。 – 2011-03-14 19:40:05
@BrokenGlass和@Adam Robinson,請參閱編輯後文章 – 2011-03-14 20:01:55