MemoryCache.Set() 是线程安全的吗?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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) 反而会为您提供您正在寻找的快乐结果。

以上是关于MemoryCache.Set() 是线程安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章

HashMap是线程安全的吗?如何实现线程安全?

java是线程安全的吗

lua引擎本身是线程安全的吗

列表是线程安全的吗?

原子增加和比较是线程安全的吗

这段代码是线程安全的吗?