可以同时读取字典吗?

smw*_*dia 24 .net c#

有一个ConcurrentDictionary类型用于并发读写操作.由于在我的场景中只有读操作,我想知道是否可以使用字典?

顺便说一下,ConcurrentDictionary如何通过多个线程为R/W服务?是否隐式使用某种锁来使所有R/W操作序列化?

ta.*_*.is 25

可以同时读取字典吗?

阅读精细的手册产量:

Dictionary<TKey, TValue>

线程安全

只要未修改集合,Dictionary就可以同时支持多个读取器.即便如此,通过集合枚举本质上不是一个线程安全的过程.在枚举与写访问争用的极少数情况下,必须在整个枚举期间锁定该集合.要允许多个线程访问集合以进行读写,您必须实现自己的同步.

对于字典的修改和写入操作,ConcurrentDictionary使用细粒度锁定来确保线程安全.(字典上的读取操作以无锁方式执行.)

至于:

ConcurrentDictionary如何通过多个线程为R/W服务?

阅读精细的手册产量:

ConcurrentDictionary<TKey, TValue> Class

备注

对于字典的修改和写入操作,ConcurrentDictionary使用细粒度锁定来确保线程安全.(字典上的读取操作以无锁方式执行.)

  • 我的回答有一个教训:"[阅读]精细手册".这么重要,它在那里两次! (14认同)
  • 这只是从文档中粘贴的.这应该只是评论中的链接,而不是答案. (3认同)
  • 根据我的理解,文档只声明*枚举*不应与写入字典同时执行。它没有说明并发随机读取和写入是否安全。 (3认同)
  • @nietaki 你是在谈论`Dictionary` 还是`ConcurrentDictionary`?`Dictionary` 说它们不安全:*要允许多个线程访问集合进行读写,您必须实现自己的同步* (2认同)

das*_*ght 17

是的,Dictionary同时阅读是一项非常有效的操作.根据文档的线程安全部分,

A Dictionary<TKey,TValue>可以同时支持多个读取器,只要不修改集合即可.

这不仅限于字典:所有数据结构在只读模式下都是线程安全的.这就是为什么不可变数据结构用于线程安全的原因.

ConcurrentDictionary如何通过多个线程为R/W服务?

它在写入操作周围使用细粒度锁定以确保线程安全.字典上的读取操作以无锁方式执行.