Dictionary非線程安全集合
代碼測試會報錯:集合已經改變
public class ConcurrentDictionaryTest { public void Run() { Dictionary<string, int> dic = new Dictionary<string, int>(); Task.Run(()=> { while (true) { foreach (var item in dic) { Console.WriteLine(item.Key); } } }); while (true) { for (int i = 0; i < 10000; i++) { dic[i.ToString()] = i; } } } }
ConcurrentDictionary線程安全集合
直接上代碼測:這個不會報錯。
public class ConcurrentDictionaryTest { public void Run() { ConcurrentDictionary<string, int> dic = new ConcurrentDictionary<string, int>(); Task.Run(()=> { while (true) { foreach (var item in dic) { Console.WriteLine(item.Key); } } }); while (true) { for (int i = 0; i < 10000; i++) { dic[i.ToString()] = i; } } } }
ConcurrentDictionary里面會有細粒度鎖定,所以在增刪查改基本不需要鎖控制。
關於他們的速率看另外一篇微博:寫入速率Dictionary快點,但在加鎖讀取情況ConcurrentDictionary更快。
代碼詳見:https://blog.csdn.net/conquerwave/article/details/50815557