9

简单的问题假设我有一个ConcurrentDictionary

我使用TryAddContainsKey方法

现在假设我从 100 个线程开始处理东西。假设当 3 个线程使用方法添加新键时,另外 3 个线程使用方法TryAdd询问键是否存在ContainsKey

ContainsKey在返回结果之前等待这 3 个线程添加进程吗?

或者它们没有同步,我的意思是这 3 个线程之一可能正在添加我使用 ContainsKey 方法询问的密钥,但是由于该过程尚未完成,我将得到的答案将是错误的

Ty 非常希望得到答案 C# WPF .net 4.5 最新

4

1 回答 1

12

“否”(参见 Sam 的评论),此外没有ContainsKey通过对 ConcurrentDictionary 的其他访问或方法调用建立原子保护。

也就是下面的代码坏了

// There is no guarantee the ContainsKey will run before/after
// different methods (eg. TryAdd) or that the ContainsKey and another
// method invoked later (eg. Add) will be executed as an atomic unit.
if (!cd.ContainsKey("x")) {
  cd.Add("x", y);
}

并且Try*应该一致地使用这些方法

cd.TryAdd("x", y);

如果需要通过专门的并发方法来保证进一步的同步(或原子性),则应建立更大的监视器/锁定上下文。

于 2014-08-20T00:30:46.713 回答