我想说:
MyCollection = new ConcurrentDictionary<string, int>();
我现在从MyCollection
安全地添加和删除项目。但是如何修改项目呢。例如,这样做是安全的:
MyCollection["key"] = 1; // thread 1
和
MyCollection["key"] = 2; // thread 2
MyCollection2 = new ConcurrentDictionary<string, List<int>>();
安全吗?
MyCollection2["key"].Add(1); // Thread1
和
MyCollection2["key"].Add(2); // Thread2
其中Thread1和Thread2同时执行。修改项目时是否必须创建锁?
答案 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>
访问权限)不。