0

假设我有:

MyCollection = new ConcurrentDictionary<string, int>();

我现在可以安全地MyCollection. 但是修改项目呢。例如,这样做是否安全:

MyCollection["key"] = 1;   // thread 1

MyCollection["key"] = 2;   // thread 2

示例 2:

MyCollection2 = new ConcurrentDictionary<string, List<int>>();

这样做安全吗?

MyCollection2["key"].Add(1);  // Thread1

MyCollection2["key"].Add(2);  // Thread2

其中 Thread1 和 Thread2 同时执行。修改项目时是否必须创建锁?

4

2 回答 2

5

修改项目是否安全完全独立于它是否在ConcurrentDictionary. 这与仅拥有一个从两个不同线程中变异的列表没有什么不同。在 的情况下List,不安全;如果您使用一种设计为从多个不同线程中变异的类型,例如 aConcurrentDictionary<string, ConcurrentQueue<int>>那么就可以了。

ConcurrentQueue只是确保观察到对该类方法的调用是原子的它没有围绕线程安全做任何其他保证。

于 2013-11-25T19:40:42.347 回答
2

第一个是完全安全的。ConcurrentDictionary 是线程安全的,因此同时在不同线程上获取/设置值不会导致问题。

你的第二个不安全。仅仅因为 ConcurrentDictionary 包含对 X 类型实例的引用并不能使 X 类型线程安全。在访问任何特定键的值时它也不会阻塞。

记住,

MyCollection2["key"].Add(1);

是相同的

var list = MyCollection2["key"];
list.Add(1);

很明显,在这种情况下,所有线程安全代码(ConcurrentDictionary 访问)都已完成,但非线程安全代码(List<T>访问)尚未完成。

于 2013-11-25T19:43:02.897 回答