当我有多个线程需要与集合同时工作时,我通常使用System.Collections.Concurrent
下的集合。
然而,与非并发对应物相比,这些集合更昂贵。我想知道在某些情况下是否可以通过非并发集合安全地替换它们。
例如,假设我有一个字典,我首先填充数据,稍后我会生成几个只有读取的线程(或任务),或者只检查密钥是否存在,但绝不写或改变它。
在这种情况下,使用Dictionary<TKey, TValue>
是否安全,或者我仍然必须使用ConcurrentDictionary<TKey, TValue>
?
在一般情况下,只要不修改集合,我可以假设所有标准集合都支持多个读者吗?
答案 0 :(得分:2)
例如,假设我有一个字典,我首先填充数据,稍后我会生成几个只从中读取的线程(或任务),或者只检查一个密钥是否存在,但从不写或更改它
是的,只要有没有编写者,就可以从多个线程的Dictionary<,>
中读取是安全的。你应该确保在最后一次写入和第一次读取之间存在内存障碍 - 但如果你在填充字典后产生了线程,那应该不是问题。
只要未修改集合,
Dictionary<TKey, TValue>
可以同时支持多个阅读器。