Concurrency 为什么不是’;t ReadOnlyDictionary线程安全吗?

Concurrency 为什么不是’;t ReadOnlyDictionary线程安全吗?,concurrency,dictionary,thread-safety,immutability,.net-4.5,Concurrency,Dictionary,Thread Safety,Immutability,.net 4.5,我正在寻找一个可从多个线程访问的只读词典。虽然ConcurrentDictionary公开了这些功能,但我不希望有这样的开销和奇怪的API .NET4.5虽然提供了这样一个类,但文档说明只有静态调用是安全的 我想知道为什么 只是其他字典的包装。因此,它只与底层字典一样具有线程安全性 特别是,如果有一个线程修改底层字典,而另一个线程从包装器中读取,则无法保证安全性 如果您想要一个从各个角度都不可变的ReadOnlyDictionary,您可以创建原始词典的克隆,在其周围创建一个ReadOnlyDi

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

.NET4.5虽然提供了这样一个类,但文档说明只有静态调用是安全的

我想知道为什么

只是其他字典的包装。因此,它只与底层字典一样具有线程安全性

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


如果您想要一个从各个角度都不可变的
ReadOnlyDictionary
,您可以创建原始词典的克隆,在其周围创建一个
ReadOnlyDictionary
包装,然后不在任何地方保留对克隆的引用。如果只进行读取操作,那么它应该是线程安全的。当然,如果键或值类型是可变的,那就需要担心第二级的“线程不安全”。

从Microsoft文档复制:线程安全ConcurrentDictionary的所有公共和受保护成员都是线程安全的,可以从多个线程同时使用。@KenCheung:不清楚您的评论为什么相关。问题表明OP已经知道
ConcurrentDictionary
,但正在询问
ReadOnlyDictionary
的安全性。只是澄清一下。只读并不意味着线程安全。如果字典根据阅读使用情况重新排列条目会怎样?BCL字典没有这样做(AFAIK),但我在某个地方读到了脚本。字典将最后一个读取的项目移动到bucket中的第一个位置。@adrianm:是的,这是真的。但是你可以包装一个从未修改过的
System.Collections.Generic.Dictionary
,这也没关系。关于“应该”,它并没有严格保证像我们预期的那样线程安全,对吧?如果这个答案是准确的,我们就进入了“非官方线程安全”行为这里-@MaxBarraclough:
字典
文档明确表示“一个
字典
可以同时支持多个读卡器,只要集合不被修改。”因此如果
ReadOnlyDictionary
包装了一个
字典
,在初始化之后,它从未被修改过,我认为它很好。@JonSkeet Perfect。我错过了。