简单的问题
假设我有ConcurrentDictionary
我使用TryAdd
和ContainsKey
方法
现在假设从100个线程我开始处理东西。假设当使用TryAdd
方法添加新密钥时3个线程使用ContainsKey
方法另外3个线程询问密钥是否存在
在返回结果之前,ContainsKey
等待这3个线程添加进程吗?
或者他们没有同步我的意思是这三个线程中的一个可能正在添加我用ContainsKey方法询问的密钥但是因为这个过程还没有完成我得到的答案会是假的
非常感谢答案C#WPF .net 4.5最新
答案 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);
如果需要通过专门的并发方法保证进一步的同步(或原子性),则应建立更大的监视/锁定上下文。