1

所以我有一个在应用程序启动时设置的 Dictionary 实例。该字典的内容在应用程序的生命周期内不会改变(因为它永远不会被修改,只能读取)。

我还需要保持资源线程安全吗?当两个线程尝试同时访问它时,它是否会抛出异常,即使它们都只是从它读取并且从不修改它?

BR托马斯

4

3 回答 3

2

不,您不需要锁定只读资源。锁定的目的是在写入之前检查资源的值,以便另一个资源无法在您的读取和写入之间更改值。

于 2013-07-23T16:56:42.957 回答
1

Dictionary<TKey, TValue>文档中,您是安全的:

线程安全

ADictionary<TKey, TValue>可以同时支持多个读取器,只要不修改集合即可。即便如此,通过集合枚举本质上不是线程安全的过程。在枚举与写访问竞争的极少数情况下,必须在整个枚举期间锁定集合。要允许集合被多个线程访问以进行读写,您必须实现自己的同步。

有关线程安全的替代方案,请参阅ConcurrentDictionary<TKey, TValue>

IReadOnlyDictionary<TKey, TValue>如果您使用.Net 4.5,将字典公开为有助于确保它以线程安全的方式使用可能是有意义的。

于 2013-07-23T16:57:57.803 回答
0

您可以在MSDN此处阅读有关 Dictionary 集合的信息

只要不修改集合,字典就可以同时支持多个阅读器。即便如此,通过集合枚举本质上不是线程安全的过程。在枚举与写访问竞争的极少数情况下,必须在整个枚举期间锁定集合。要允许集合被多个线程访问以进行读写,您必须实现自己的同步。

有关线程安全的替代方案,请参阅ConcurrentDictionary

此类型的公共静态(在 Visual Basic 中为共享)成员是线程安全的

于 2013-07-23T16:57:27.423 回答