这个问题主要是学术性的 - 我明白这不一定是实用的代码。
考虑这个代码,其中线程安全是一个问题:
// 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;?
答案 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"));
}
}
因此它调用TryAdd
(ConcurrentDictionary
的“安全”方法)并且如果无法添加密钥 - 抛出异常,表示具有此类密钥的条目已存在。
它仍然是“线程安全的”,因为你不会有令人讨厌的副作用,你将使用常规字典并从多个线程添加项目。如果您准备此类例外 - 您可以安全地将具有Add
的项目从多个线程添加到此类词典中。