Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从不同线程修改并发集合是否安全_C#_Multithreading_Concurrent Collections - Fatal编程技术网

C# 从不同线程修改并发集合是否安全

C# 从不同线程修改并发集合是否安全,c#,multithreading,concurrent-collections,C#,Multithreading,Concurrent Collections,假设我有: MyCollection = new ConcurrentDictionary<string, int>(); 及 例2: 及 其中,Thread1和Thread2同时执行。修改项目时是否必须创建锁?修改项目是否安全完全取决于它是否在ConcurrentDictionary中。这和从两个不同的线程中生成一个列表没有什么不同。如果是列表,则不安全;如果您使用的类型被设计为从多个不同的线程中进行变异,例如concurrentdirectionary,那么就可以了 Conc

假设我有:

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


例2: 及


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

修改项目是否安全完全取决于它是否在
ConcurrentDictionary
中。这和从两个不同的线程中生成一个列表没有什么不同。如果是
列表
,则不安全;如果您使用的类型被设计为从多个不同的线程中进行变异,例如
concurrentdirectionary
,那么就可以了


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

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

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

记住

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

var list = MyCollection2["key"];
list.Add(1);
显然,在这种情况下,所有线程安全代码(ConcurrentDictionary访问)都已完成,但非线程安全代码(
List
access)尚未完成

MyCollection2 = new ConcurrentDictionary<string, List<int>>();
MyCollection2["key"].Add(1);  // Thread1
MyCollection2["key"].Add(2);  // Thread2
MyCollection2["key"].Add(1);
var list = MyCollection2["key"];
list.Add(1);