【问题标题】:Accessing same resource from different threads when resource is static当资源是静态的时从不同的线程访问相同的资源
【发布时间】:2013-07-24 00:57:57
【问题描述】:

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

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

BR托马斯A

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

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

    【讨论】:

    • 已经有一段时间了,我很惊讶我不得不在 3 年前问这个问题,无论如何非常感谢您的回答,将其标记为正确并赞成。
    【解决方案2】:

    来自Dictionary<TKey, TValue> documentation,您很安全:

    线程安全

    一个Dictionary<TKey, TValue>可以支持多个阅读器 同时,只要集合没有被修改。即使是这样, 通过集合枚举本质上不是线程安全的 程序。在枚举与写入竞争的极少数情况下 访问时,必须在整个枚举期间锁定集合。 允许集合被多个线程访问以进行读取 和写作,你必须实现自己的同步。

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

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

    【讨论】:

      【解决方案3】:

      你可以在这里MSDN阅读有关字典集合的信息

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        相关资源
        最近更新 更多