【发布时间】:2011-03-14 19:32:22
【问题描述】:
ConcurrentDictionary<TKey, TValue> Class 表示一个线程安全的键值对集合,可以被多个线程同时访问。
但据我所知,System.Collections.Concurrent 类是为 PLINQ 设计的。
我有Dictionary<Key,Value>,它将在线客户端保存在服务器中,当我可以访问它时,我通过锁定对象使其成为线程安全的。
在我的情况下,我可以安全地将Dictionary<TKey,TValue> 替换为ConcurrentDictionary<TKey,TValue> 吗?更换后性能会提升吗?
Here 在第 5 部分 Joseph Albahari 提到它是为并行编程设计的
- 并发集合针对并行编程进行了调整。除了高度并发的场景外,传统集合的性能都优于它们。
- 线程安全的集合并不能保证使用它的代码是线程安全的。
- 如果在另一个线程正在修改并发集合时枚举并发集合,则不会引发异常。相反,您会得到新旧内容的混合。
- 没有并发版本的 List。
- 并发堆栈、队列和包类在内部使用链表实现。这使得它们的内存效率低于非并发 Stack 和 Queue 类,但更适合并发访问,因为链表有利于无锁或低锁实现。 (这是因为将节点插入到链表中只需要更新几个引用,而将元素插入到类似列表的结构中可能需要移动数千个现有元素。)
【问题讨论】:
-
我不知道 System.Collections.Concurrent 类是“为 PLINQ 设计的”这一事实 - 你从哪里得到这个想法?
-
@BrokenGlass:也许从某种意义上说,lambda 和匿名类型是“为 LINQ 设计的”;它们出现在框架中因为 LINQ,但它们肯定具有超越它的适用性。
-
@BrokenGlass 和 @Adam Robinson,查看编辑后的帖子
-
这仅表明它已针对包括 PLINQ 的 并行编程 进行了调整,但通常也适用于任何多线程场景,从 TPL 到手动生成的方法有很多线程。
-
好的@BrokenGlass,我认为有相同的......谢谢!
标签: c# c#-4.0 dictionary concurrent-collections