多级ConcurrentDictionary是否仍然是线程安全的?

Mat*_*ský 4 .net c# concurrency .net-4.0 parallel-extensions

我有四个级别的数据结构定义如下:

Dictionary<Type1, Dictionary<Type2, Dictionary<Type3, List<Type4>>>>
Run Code Online (Sandbox Code Playgroud)

整个事情被封装在一个同样保持线程安全的类中.目前它只是在读取/操作数据时锁定整个集合(读取比写入更常见).

我正在考虑更换Dictionarywith ConcurrentDictionaryListwith ConcurrentBag(它的项目不必订购).

如果我这样做,我可以消除锁定并确保并发集合能够正常工作吗?

Man*_*nia 6

我差不多晚了一年......但是如果有人发现自己处于与MatějZábský相似的位置,请问自己:

你能用Dictionary<Tuple<Type1, Type2, Type3>, List<Type4>>吗?

使用起来相当容易,并且考虑到散列表(即字典)是O(1)数据结构,具有一定程度上很大的常量组件(如果你移动到a,则更是如此ConcurrentDictionary)它也可能表现得更快.它也使用更少的内存,并且转换为一个非常简单ConcurrentDictionary.

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

  • 我绝对同意使用字典和元组键比嵌套字典更好,但我发现我的解决方案的嵌套特性很有用(我可以通过删除一个字典来删除所有带有L1键X的项目 - O(1)而不是O(N) ,通过删除一个L2字典,将所有项目与L1和L2键组合起来......).然而,当然可能并非经常发生这种情况.+1 (2认同)