繁体   English   中英

ConcurrentDictionary ContainsKey方法是同步的吗?

[英]Is ConcurrentDictionary ContainsKey method synched?

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

我使用TryAddContainsKey方法

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

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

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

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

“不”(参见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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM