带锁的词典或Conferency词典

本文关键字:Conferency 词典 | 更新日期: 2023-09-27 18:29:10

在多线程应用程序中首选:带锁定对象的字典或并发字典

哪种是有效的,为什么我应该使用其中一种?

编辑1:将Guid存储为键,将bool存储为值。

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

带锁的词典或Conferency词典

我认为您有以下选项。

一些新的Framework 4.0类:

  • ConcurrentDictionary。工作快速可靠
  • ConcurrentBag。它是对象的无序集合,因此工作速度更快,但如果您不需要仅排序,则适用
  • ConcurrentStack。它是经典的后进先出(Last-In-First-Out)数据结构的实现,提供线程安全访问,无需外部同步
  • 并发队列。它是线程安全的FIFO(先进先出)集合

所有新的4.0类工作速度更快,但具有levanovd提到的一些功能。你可以在这里找到这些类的性能比较。

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

  • Dictionary+Monitor。简单换行到锁定
  • Dictionary+ReaderWriterLock。比上一个更好,因为它有读写锁。因此,几个线程可以读取,而只有一个线程可以写入
  • Dictionary+ReaderWriterLockSlim。这只是对上一个的优化
  • 哈希表。根据我的经验,这是最慢的方法。检查Hashtable.Synchronized()方法,这是一个现成的Microsoft解决方案

如果我有使用Framework v3.5的限制,我会使用Dictionary+ReaderWriterLockRead erWriterLockSlim

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

以下是其中的一些:

  • 如果两个线程调用AddOrUpdate,则不能保证将调用哪个工厂委托,甚至不能保证如果工厂委托将生成某个项,则该项将存储在字典中
  • GetEnumerator调用获得的枚举器是而不是快照,可以在枚举过程中进行修改(不会导致任何异常)
  • CCD_ 3和CCD_ 4属性是对应集合的快照,并且可能不对应于实际字典状态
  • 等等

因此,请再次阅读ConcurrentDictionary,并决定这种行为是否是您所需要的。

希望这能有所帮助!

当您使用锁对象实现字典时,您主要关心的问题似乎是线程安全。看来,concurrentDictionary已经处理了这个问题。我认为重新发明轮子是没有意义的。

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