【发布时间】:2018-02-07 17:39:05
【问题描述】:
我对 C# 中的并发字典有疑问。
在另一个问题中,有人问我如何使用哈希集作为值的并发字典,但使用哈希集不是一个好主意,最好使用并发字典作为值。所以我得到的解决方案是这样的:
var myDic = new ConcurrentDictionary<long, ConcurrentDictionary<int, byte>>();
myDic.AddOrUpdate(key,
_ => new ConcurrentDictionary<int, byte>(new[] {new KeyValuePair<int, byte>(element, 0)}),
(_, oldValue) => {
oldValue.TryAdd(element, 0);
return oldValue;
});
假设我有两个线程,其中“元素”在线程 A 中为 1,在线程 B 中为 2。
我怀疑这是否是线程安全的。我可能是错的,但我认为并发字典以这种方式工作:
线程A:尝试为key 1插入元素1。key 1不存在,所以尝试用并发字典ConcurrentDictionary<int, byte>(new[] {new KeyValuePair<int, byte>(1, 0)插入key 1。
线程 B:尝试在 key 1 的字典中插入 item 2。线程 A 仍在添加新的 key/value,线程 B 认为 key 1 不存在,所以尝试添加 value ConcurrentDictionary<int, byte>(new[] {new KeyValuePair<int, byte>(2, 0)到关键 1。
线程 A 完成插入键/值对。
线程 B 尝试完成,但现在密钥 1 存在,因为线程 A 插入了密钥 1。因此线程 B 无法插入密钥/值。
那么会发生什么?线程 B 的工作被丢弃,所以我将在并发字典中只有一项用于键 1?或者线程 B 进入 updateValueFactory 并将第 2 项添加到字典中?
【问题讨论】:
标签: c# thread-safety concurrentdictionary