线索安全与字典

Jon*_*Jon 12 .net c# multithreading .net-4.0

如果我有

Dictionary<int, StreamReader> myDic = new Dictionary<int, StreamReader>
//Populate dictionary
Run Code Online (Sandbox Code Playgroud)

一个线程呢

myDic[0] = new StreamReader(path);
Run Code Online (Sandbox Code Playgroud)

另一个线程呢

myDic[1] = new StreamReader(otherpath)
Run Code Online (Sandbox Code Playgroud)

这个线程是否安全,因为字典中的实际项目被修改与另一个线程上的实际项目不同,或者我会得到一个 InvalidOperationException: Collection was modified

SLa*_*aks 18

你将只能得到InvalidOperationException: Collection was modified,如果你列举的词典,而修改.

但是,这不是线程安全的.
如果其中一个操作导致字典调整大小,则另一个操作可能会丢失.
相反,使用ConcurrentDictionary.


par*_*mar 5

如果从多个线程读取,System.Collections.Generic集合只是线程安全的.

引自MSDN

System.Collections.Generic集合类不提供任何线程同步; 用户代码必须在多个线程上同时添加或删除项目时提供所有同步

如果您希望读取和写入操作都需要线程安全,请考虑使用System.Collections.Concurrent

*当您编写新代码时,只要集合将同时写入多个线程,就使用并发集合类.*