【问题标题】:Is MemoryCache.Set() thread-safe?MemoryCache.Set() 是线程安全的吗?
【发布时间】:2011-10-07 23:09:38
【问题描述】:

不幸的是,MSDN documentation for MemoryCache.Set 没有明确说明它是否是线程安全的。

在没有显式锁定的情况下从多个线程使用.Get().Set() 是否安全?

【问题讨论】:

    标签: c# thread-safety memorycache


    【解决方案1】:

    是的,MemoryCache 类is thread safe

    System.Runtime.Caching.MemoryCache 是线程安全的。多个并发 线程可以读取和写入 MemoryCache 实例。内部 自动处理线程安全以确保更新缓存 以一致的方式。

    这可能指的是存储在缓存中的数据 本身可能不是线程安全的。例如,如果一个列表被放置在 缓存,两个单独的线程都获得对缓存的引用 清单,如果两个线程最终会互相踩踏 两者都尝试同时更新列表。

    这就是说 Get 和 Set 方法是线程安全的,但是如果您可能存储到此缓存中的数据结构不是线程安全的,您可能会遇到麻烦。例如,假设您在此缓存中存储了一个字典。然后当 thread1 使用 Get 获取字典并开始从中读取时,thread2 使用 Get 获取相同的字典并尝试写入它。虽然 Get 操作将是线程安全的,但接下来发生的事情可能非常糟糕。

    【讨论】:

    • 我很抱歉这个问题,但我很好奇应该如何解决这样的情况。你能详细说明一下吗?
    • Massive necro 但对于现在正在查看此线程的任何人,我个人会通过同步锁定对数据结构执行的原子操作来处理它。假设您需要迭代几个对象并进行更新,您将在执行缓存更新的块周围实现锁定代码。
    • 事实上,正如你所说,内存缓存本身是线程安全的,但可能存储的数据结构不是线程安全的,这不是 MemoryCache 的问题,它也适用也适用于其他缓存框架。
    【解决方案2】:

    MemoryCache 的文档指出:

    这种类型是线程安全的。

    【讨论】:

    • 天哪,我真的没有想到要查看 type 而不是单个 methods 的文档...
    • @Timwi:没问题。我见过的大多数类型确实在他们的文档中包含了“静态成员是线程安全的,实例成员不保证是线程安全的”的声明。这个特殊的课程 (MemoryCache) 反而会为您提供您正在寻找的快乐结果。
    猜你喜欢
    • 2021-10-12
    • 2015-04-18
    • 2012-03-02
    • 2011-10-28
    • 2023-03-14
    • 2016-08-24
    • 2011-08-16
    • 2011-09-28
    • 2010-12-14
    相关资源
    最近更新 更多