2012-03-26 52 views
5

这是优选的在多线程应用程序: Dictionary与锁定对象 或 Concurrency Dictionary带锁或Conconncy字典的词典?

哪些是有效的,为什么我应该使用一种或另一种?

编辑1:存储GUID作为关键和布尔值作为。

编辑2:2个以上的工作线程,一个UI线程。

+2

这将取决于情况。 – 2012-03-26 07:44:44

+1

[dictionary-locking-vs-concurrentdictionary]可能重复(http://stackoverflow.com/questions/1949131/net-dictionary-locking-vs-concurrentdictionary) – 2013-05-03 18:46:15

回答

4

仔细约ConcurrentDictionary阅读。它有一些不明显的特征。

下面是其中一些:

  • 如果两个线程调用AddOrUpdate没有保证哪个厂家代表将被调用,甚至不能保证,如果一个工厂的代表,会产生一些项目,这个项目将是存储在字典中。
  • GetEnumerator调用获得的枚举器是而不是快照,并可能在枚举过程中被修改(这不会导致任何异常)。
  • KeysValues属性是对应集合的快照,并可能不对应于实际字典状态。

所以请有关ConcurrentDictionary再次读取,并决定是否这种行为是你所需要的。

希望这会有所帮助!

2

当你实现一个锁对象字典,你主要关注的似乎是线程安全的。所以看起来,并发词典已经处理了这个问题。我认为重新发明车轮没有意义。

+2

并不总是如此。如果速度很快,手动锁定可能会更好。 – 2012-03-26 07:46:01

+1

根据情况,您可能是对的,另一方面,这种情况下没有适用的绩效数据。定制测试可以验证性能增益(如果有的话)。 – daryal 2012-03-26 07:50:18

+0

速度确实很重要。 – 2012-03-26 07:53:39

1

我认为两者都将提供线程安全的,但使用字典与锁定对象将限制可以在使用并发字典并发访问字典为1线程的数量,你可以指定并发级别(即线程数量可以同时访问字典)。如果性能确实重要,我相信Concurrent Dictionary应该是您的选择。

5

我会说你有以下选项。

一些新的框架4.0类:

  • ConcurrentDictionary。工作快速可靠。
  • ConcurrentBag。这是无序集合对象,因此它可以更快,但西装,如果你不只需要排序。
  • ConcurrentStack。它是传统的后进先出(Last-In First Out)数据结构的实现,它提供了无需外部同步的线程安全访问。
  • ConcurrentQueue。这是一个线程安全的FIFO(先入先出)收集

所有新的4.0类工作得更快,但必须由levanovd提到的一些功能。这些类的性能比较,你可以找到here

从早期版本的一些经典解决方案:

  • 字典​​。简单包装到
  • 字典 + ReaderWriterLock。比前一个更好,因为有读写锁。所以有几个线程可以读取,只有一个 - 写入。
  • 字典 + ReaderWriterLockSlim。这只是前一个的优化。
  • Hashtable。从我的经验来看,这是最慢的方法。检查Hashtable.Synchronized()方法,这是一个随时可以从微软解决方案。

如果我不得不使用框架v3.5版本的限制,我会用字典 + ReaderWriterLockReaderWriterLockSlim