我正在寻找一个可以从多个线程访问的只读字典。虽然ConcurrentDictionary公开了这些功能,但我不希望有开销和奇怪的API。
.Net 4.5在提供这样的类时,文档指出只有静态调用才是安全的。
我想知道为什么?
答案 0 :(得分:10)
ReadOnlyDictionary
只是任何其他字典的包装器。因此,它仅作为基础字典的线程安全。
特别是,如果有另一个线程从包装器读取而修改基础字典的线程,那么就不能保证安全。
如果你希望ReadOnlyDictionary
从所有角度实际上是不可变的,你可以创建一个原始字典的克隆,围绕它创建一个ReadOnlyDictionary
包装,然后不要在任何地方保留对克隆的引用。只有 读取操作继续进行,它应该是线程安全的。当然,如果键或值类型是可变的,那么会打开第二个“线程 - 不安全”的程度。担心。