2015-02-11 28 views
1

词典可以支持多个读者同时, 只要集合不会被改动。尽管如此,通过集合枚举 本质上不是一个线程安全的过程。在枚举与写入访问竞争的罕见情况下, 集合必须在整个枚举期间被锁定。为了允许多个线程访问 集合进行读取和写入,您必须实现自己的同步。C#字典<T,K>线程安全的单写多读者

这就是MSDN所说的。

我不想使用ConcurrentDictionary如果没有必要

我认为,如果只有一个线程上执行Dictionary<T,K>作家操作,它是安全的其他线程执行简单的读操作(如TryGetValue而不是枚举)在同一时间没有获得锁,我是否正确?

回答

1

旧的System.Collections.Hashtable对于多读者 - 单写者场景是安全的,也就是说,任何数量的线程都可以从Hashtable中读取,但最多一个线程可以同时对其进行修改。 (当读者正在阅读时,作者线程可以安全地修改Hashtable)。

通用Dictionary<T,K>对于这种情况不安全 - 请使用ConcurrentDictionary<T,K>代替。

请注意System.Collections.HashtableConcurrentDictionary<T,K>使用完全不同的实现并提供不同的API。 ConcurrentDictionary<T,K>非常适合懒惰初始化和通读缓存等场景。 System.Collections.Hashtable更高性能,因为它是一种无锁数据结构,而ConcurrentDictionary<T,K>使用线程同步封送到Windows API。

5

我认为,如果只有一个线程 字典执行作家操作,它是安全的其他线程来执行简单 读操作(如TryGetValue不枚举)在同一时间 没有获取锁

不可以。您的假设是错误的。只有在没有作者修改字典的情况下,而不是只有一个作者时才是安全的。

ReaderWriterLockSlim正是为了在这种情况下使用而设计的。这就是说我只是用ConcurrentDictionary而不是重新发明了轮子