字典可以同时支持多个读者, 只要集合没有被修改。即便如此,列举 通过集合本质上不是一个线程安全的过程。在 枚举与写访问争用的罕见情况 必须在整个枚举期间锁定集合。允许的 多个线程可以访问的集合,用于读写 你必须实现自己的同步。
这就是MSDN所说的。
如果没有必要,我不想使用ConcurrentDictionary
我假设,如果只有一个线程在Dictionary<T,K>
上执行编写器操作,则其他线程可以安全地同时执行简单的读取操作(如TryGetValue
而不是枚举)而无需获取锁,我是对的吗?
答案 0 :(得分:5)
我假设,如果只有一个线程执行编写器操作 字典,其他线程执行简单是安全的 同时读取操作(如TryGetValue不枚举) 没有获得锁定
没有。你的假设是错误的。只有当没有作者修改字典时才安全,而不是当你有一个作家时。
ReaderWriterLockSlim完全是为在这种情况下使用而设计的。这就是说我只使用ConcurrentDictionary代替重新发明轮子。
答案 1 :(得分:1)
旧的System.Collections.Hashtable
对于多读者单作者场景是安全的,也就是说,任何数量的线程都可以从Hashtable中读取,但最多只有一个线程可以同时修改它。 (作者线程可以在读者阅读时安全地修改Hashtable)。
通用Dictionary<T,K>
对于此类情况并不安全 - 请改用ConcurrentDictionary<T,K>
。
请注意,System.Collections.Hashtable
和ConcurrentDictionary<T,K>
使用完全不同的实现并提供不同的API。 ConcurrentDictionary<T,K>
非常适合延迟初始化和读取缓存等场景。 System.Collections.Hashtable
性能更高,因为它是一种无锁数据结构,而ConcurrentDictionary<T,K>
使用封装到Windows API的线程同步。