我正在寻找一个只读字典,可以从多个线程中访问。虽然ConcurrentDictionary提供了这样的功能,但我不想有额外的开销和奇怪的API。
尽管.NET 4.5提供了这样的类,但文档指出只有静态调用是安全的。
我在想为什么?
尽管.NET 4.5提供了这样的类,但文档指出只有静态调用是安全的。
我在想为什么?
ReadOnlyDictionary
只是包装在其他字典周围的一个封装器。因此,它的线程安全性与基础字典一样。
特别地,如果有一个线程正在修改基础字典,而另一个线程从包装器中读取,那么就不能保证安全。
如果您想要一个ReadOnlyDictionary
,使其从所有角度看起来都是不可变的,您可以创建原始字典的副本,创建一个ReadOnlyDictionary
包装器,并且不在任何地方保留副本的引用。仅进行读取操作,则应该是线程安全的。当然,如果键或值类型是可变的,则会打开第二个“线程不安全”的问题。
System.Collections.Generic.Dictionary
,那样就没问题了。 - Jon SkeetDictionary
的文档明确指出:“只要集合没有被修改,Dictionary<TKey,TValue>
可以同时支持多个读取器。”因此,如果 ReadOnlyDictionary
包装了一个 Dictionary
,并且在初始化后从未被修改,我认为这是可以的。 - Jon Skeet
ConcurrentDictionary<,>
,但正在询问ReadOnlyDictionary<,>
的安全性。 - Jon Skeet