可以同时读取字典吗?

时间:2014-07-05 13:28:06

标签: c# .net

用于并发读写操作的ConcurrentDictionary类型。由于我的场景中只有读取操作,我想知道是否可以使用词典?

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

2 个答案:

答案 0 :(得分:24)

  

同时阅读字典是否可以?

Reading the fine manual收益:

  

Dictionary<TKey, TValue> Class

     

线程安全

     

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

     

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

至于:

  

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

Reading the fine manual收益:

  

ConcurrentDictionary<TKey, TValue> Class

     

说明

     

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

答案 1 :(得分:15)

是的,同时阅读Dictionary是完全有效的操作。根据{{​​3}}的线程安全部分,

  

只要未修改集合,Dictionary<TKey,TValue>可以同时支持多个阅读器。

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

  

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

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