【发布时间】:2010-12-08 07:05:11
【问题描述】:
我想使用 if-lock-if 模式来检查对象是否存在于多线程环境中的字典中。因此,我正在考虑的代码如下所示:
private IDictionary<string, SomeType> m_dic = new Dictionary<string, SomeType>();
private SomeType GetSomeObject(string key)
{
SomeType obj;
if (!m_dic.TryGetValue(key, out obj))
{
lock(m_dic)
{
if (!m_dic.TryGetValue(key, out obj))
{
m_dic[key] = obj = CreateSomeObject(key);
}
}
}
return obj;
}
我的假设是即使另一个线程现在正在同一键处插入对象,TryGetValue 也不会返回部分设置的引用(这样的东西在 .NET 中不存在,对吗?),而是它将返回 null,因此我们进入受保护部分并重复检查。
我的问题是我的假设是否正确,代码是否正确?
谢谢。
编辑
让我提出一个限制。字典实际上是单例对象的字典。因此,一旦条目被占用,它就永远不会改变。就像单例的 Instance 属性一样——一旦设置,它就永远不会改变。鉴于该约束,我们可以使用 if-lock-if 模式吗?
【问题讨论】:
-
重新编辑:不,字典的内部缓冲区仍然不是线程安全的。
标签: .net multithreading dictionary