并发集合可以安全地从不同的线程进行修改

时间:2013-11-25 19:37:19

标签: c# multithreading concurrent-collections

我想说:

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同时执行。修改项目时是否必须创建锁?

2 个答案:

答案 0 :(得分:5)

修改项目是否安全完全取决于它是否在ConcurrentDictionary中。这与仅从两个不同的线程中变异的列表没有什么不同。在List的情况下,它不安全;如果您使用 Designed 的类型从多个不同的线程(例如ConcurrentDictionary<string, ConcurrentQueue<int>>)进行变异,那么就可以了。

ConcurrentQueue 确保对该类方法的调用是原子的;它没有任何其他保证线程安全。

答案 1 :(得分:2)

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

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

记住,

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

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

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