ConcurrentDictionary ContainsKey方法是同步的吗?

时间:2014-08-20 00:19:34

标签: c# multithreading concurrentdictionary

简单的问题 假设我有ConcurrentDictionary

我使用TryAddContainsKey方法

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

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

或者他们没有同步我的意思是这三个线程中的一个可能正在添加我用ContainsKey方法询问的密钥但是因为这个过程还没有完成我得到的答案会是假的

非常感谢答案C#WPF .net 4.5最新

1 个答案:

答案 0 :(得分:8)

"否" (参见Sam的评论),此外 ContainsKey通过对ConcurrentDictionary的其他访问或方法调用建立了 no 原子防护。

即,以下代码已损坏

// 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);

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