当前位置:  开发笔记 > 编程语言 > 正文

ContainsKey线程安全

如何解决《ContainsKey线程安全》经验,为你挑选了2个好方法。

在以下代码中:

public class StringCache
{
    private readonly object lockobj = new object();

    private readonly Dictionary cache = new Dictionary();

    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线程是否安全?IOW,如果在另一个线程向字典中添加内容时执行该方法会发生什么?2)对于第一个返回缓存[key],是否有可能返回乱码值?

TIA,

MB



1> Michael..:

ContainsKey固有的线程安全无关紧要,因为ContainsKey和cache [key]之间没有同步.

例如:

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上发布了一篇很棒的博客文章集合.



2> jsw..:

不,如果您在尝试阅读时写入值,则ContainsKey不是线程安全的.

是的,你有可能找回无效的结果 - 但你可能会先开始看异常.

看看ReaderWriterLockSlim是否锁定了这样的情况 - 它是为了做这种事情而构建的.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有