4

我有这样定义的四级数据结构:

Dictionary<Type1, Dictionary<Type2, Dictionary<Type3, List<Type4>>>>

整个事情都封装在一个类中,该类也维护线程安全。目前它只是在读取/操作数据时锁定整个集合(读取比写入更常见的数量级)。

我正在考虑替换DictionarywithConcurrentDictionaryListwith ConcurrentBag(它的项目不必订购)。

如果我这样做,我可以消除锁并确保并发集合能够正确完成它们的工作吗?

4

2 回答 2

6

我迟到了将近一年的时间。但以防万一有人发现自己处于与 Matěj Zábský 相似的位置,问问自己:

你可以用 aDictionary<Tuple<Type1, Type2, Type3>, List<Type4>>代替吗?

使用起来相当容易,并且考虑到哈希表(即字典)是 O(1) 数据结构,具有相当大的常量组件(如果移至 a 更是如此ConcurrentDictionary),它的执行速度也可能更快。它还会使用更少的内存,并且转换为ConcurrentDictionary.

当然,如果您需要枚举给定键的所有给Type2Type1键,则嵌套字典可能是要走的路。但这是一个要求吗?

于 2011-12-12T10:19:30.227 回答
4

并发集合将防止数据损坏和崩溃,但代码在语义上不会与您当前的代码等效。例如,如果您迭代其中一个并发字典,则其中一些项目可能属于不同的更新

从字典返回的枚举器可以安全地与字典的读取和写入同时使用,但它并不代表字典的即时快照。通过枚举器公开的内容可能包含调用 GetEnumerator 后对字典所做的修改。

如果你想保持你现在的行为,同时节省锁定成本,你可能想用ReaderWriterLockSlim锁定,它特别适合读多于写的情况。

于 2011-02-09T12:49:25.543 回答