为什么ReadOnlyDictionary不是线程安全的?

Mou*_*ouk 11 concurrency dictionary immutability thread-safety .net-4.5

我正在寻找一个可以从多个线程访问的只读字典.虽然ConcurrentDictionary暴露了这样的功能,但我不希望有开销和奇怪的API.

.Net 4.5虽然提供了这样的类,但文档指出只有静态调用才是安全的.

我想知道为什么?

Jon*_*eet 11

ReadOnlyDictionary只是任何其他字典的包装.因此,它仅作为基础字典的线程安全.

特别是,如果有一个线程修改底层字典而另一个线程从包装器读取,则无法保证安全性.

如果你想要一个ReadOnlyDictionary各个角度都是有效不可变的,你可以创建一个原始字典的克隆,创建一个ReadOnlyDictionary包装器,然后不在任何地方保持对克隆的引用.与读操作正在进行,应该再是线程安全的.当然,如果键或值类型是可变的,那就会引起第二个"线程不安全"的担忧.

  • 只是一个澄清.只读并不意味着线程安全.如果字典根据读取使用情况重新排列项目怎么办?BCL词典没有这样做(AFAIK)但我在某处读到Scripting.Dictionary将最后读取的项目移动到桶中的第一个位置. (3认同)