首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContainsKey线程安全

ContainsKey线程安全
EN

Stack Overflow用户
提问于 2009-04-02 17:14:37
回答 5查看 6.4K关注 0票数 10

在以下代码中:

代码语言:javascript
复制
public class StringCache
{
    private readonly object lockobj = new object();

    private readonly Dictionary<int, string> cache = new Dictionary<int, string>();

    public string GetMemberInfo(int key)
    {
        if (cache.ContainsKey(key))
            return cache[key];
        lock (lockobj)
        {
            if (!cache.ContainsKey(key))
                cache[key] = GetString(key);
        }
        return cache[key];
    }

    private static string GetString(int key)
    {
        return "Not Important";
    }
}

1) ContainsKey线程安全吗?2)对于第一个返回的cachekey,有没有可能返回一个乱码?

蒂娅

MB

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-02 17:17:36

ContainsKey固有的线程安全性无关紧要,因为ContainsKey和cachekey之间不存在同步。

例如:

代码语言:javascript
复制
if (cache.ContainsKey(key))
   // Switch to another thread, which deletes the key.
   return cache[key];

MSDN在这一点上非常清楚:

若要允许多线程访问集合以进行读写,您必须实现自己的同步。

为了获得更多信息,JaredPar在http://blogs.msdn.com/jaredpar/archive/2009/02/11/why-are-thread-safe-collections-so-hard.aspx上发布了一篇关于线程安全集合的很好的博客文章。

票数 14
EN

Stack Overflow用户

发布于 2009-04-02 17:33:13

不,如果你在读的时候写值,ContainsKey就不是线程安全的。

是的,您有可能返回无效的结果--但是您可能会首先看到异常。

看看在这样的情况下进行锁定的ReaderWriterLockSlim --它就是用来做这类事情的。

票数 7
EN

Stack Overflow用户

发布于 2009-04-02 17:19:37

下面是它在MSDN documentation:中显示的内容

此类型的

公共静态(在Visual Basic中为Shared)成员是线程安全的。不能保证任何实例成员都是线程安全的。

只要集合没有被修改,一个Dictionary<(Of <(TKey,TValue>)>)可以同时支持多个读取器。尽管如此,枚举集合本质上不是线程安全的过程。在枚举与写访问冲突的极少数情况下,必须在整个枚举期间锁定集合。若要允许多个线程访问集合以进行读写,您必须实现自己的同步。

如果我没看错的话,我不相信它是线程安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/710696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档