在下面的代码中:
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线程安全吗? IOW,如果当另一个线程向字典添加内容时正在执行该方法会发生什么?
2)对于第一次返回cache[key],是否有可能返回乱码?
TIA,
MB
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关于线程安全集合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)