【发布时间】:2012-04-11 18:55:14
【问题描述】:
由于 IDictionary 没有 GetOrAdd 和 AddOrUpdate 方法,从 ConcurrentDictionary 到 IDictionary 的转换是否会切断线程安全实现?
【问题讨论】:
-
确切地说,“剪切”是什么意思?它会从
ConcurrentDictionary中删除它吗?否。它可以从IDictionary界面获得吗?没有。 -
@JamesMichaelHare:他的意思是,如果你转换为
IDictionary,它会使生成的对象线程不安全吗?也就是说,它是不是把它变成了一本普通的字典? -
它仍然是线程安全的吗?是的,只要没有这些操作就可以。也就是说,如果你需要一个原子的
GetOrAdd(),那你就不走运了。 -
@JamesMichaelHare
GetOrAdd()不是原子的。委托在内部锁之外执行以防止死锁。见msdn.microsoft.com/en-us/library/dd997369.aspx -
@mikez:是的,对不起,原子是错误的选择。我的错。我的意思是说,如果实际的 Add() 不存在,它将被同步,因此只有一个竞争对手实际执行 Add(),但正如您从 MSDN 正确指出的那样,多个同时调用者可能会执行委托并最终生成被忽略的不需要的项目。
标签: c# .net concurrency thread-safety