拥有一个可能会看到非常高的并发只读访问权限的.net集合(字典),它是否仍需要保护,这意味着我应该使用集合的线程安全版本或使用同步机制,或者是线程安全只是在存在并发读写活动的情况下才是主题?
答案 0 :(得分:4)
只有当读取与写入同时发生时,才需要同步对集合的访问。
如果您的集合在程序开始时构造一次,然后仅在读取其元素或迭代其内容时被访问,则无需在读取周围添加任何其他同步。
.NET framework提供了一个Immutable Collections包来确保这个执行流程。您预先构建了不可变集合,然后您的代码无法在无意中修改它。
答案 1 :(得分:0)
使用ConcurrentDictionary
这是一个线程安全的键/值对集合,并且允许多个线程同时访问它们。您可以在ConcurrentDictionary阅读。
ConcurrentDictionary<TKey, TValue>
实现从.NET Framework 4.6开始的IReadOnlyCollection<T>
和IReadOnlyDictionary<TKey, TValue>
接口;在以前版本的.NET Framework中,ConcurrentDictionary类没有实现这些接口。
此类的所有操作都是原子操作且是线程安全的唯一例外是接受委托的方法,即AddOrUpdate和GetOrAdd。
对于字典的修改和写入操作,ConcurrentDictionary<TKey, TValue>
使用细粒度锁定来确保线程安全。
字典上的读取操作以无锁方式执行。
但是,这些方法的委托在锁外部调用,以避免在锁定下执行未知代码时可能出现的问题。因此,这些代理执行的代码不受操作原子性的影响。