IDictionary和ConcurrentDictionary的线程安全注意事项

时间:2017-10-30 16:37:44

标签: c# .net concurrency clr

这个问题主要是学术性的 - 我明白这不一定是实用的代码。

考虑这个代码,其中线程安全是一个问题:

// In the constructor
IDictionary<string, string> myDictionary = new ConcurrentDictionary<string, string>();

...

// Elsewhere in the class
myDictionary.Add("foo", "bar");

我的整体问题:如何从并发的角度处理这个问题?

这会被认为是线程安全的,如果是,为什么?我问,因为(已知的)线程安全方法是AddOrUpdate - 我无法通过IDictionary访问此方法。 CLR&#34;足够聪明&#34;知道这里发生了什么?我在这里缺少继承属性,.Add调用是否可以变成.AddOrUpdate调用&#34;引擎盖&#34;?

1 个答案:

答案 0 :(得分:2)

CLR与此无关。 ConcurrentDictionary隐式实现了接口IDictionary<TKey, TValue>,您可以看到它对IDictionary.Add here的作用:

void IDictionary<TKey, TValue>.Add(TKey key, TValue value)
{
     if (!TryAdd(key, value))
     {
          throw new ArgumentException(GetResource("ConcurrentDictionary_KeyAlreadyExisted"));
    }
}

因此它调用TryAddConcurrentDictionary的“安全”方法)并且如果无法添加密钥 - 抛出异常,表示具有此类密钥的条目已存在。

它仍然是“线程安全的”,因为你不会有令人讨厌的副作用,你将使用常规字典并从多个线程添加项目。如果您准备此类例外 - 您可以安全地将具有Add的项目从多个线程添加到此类词典中。