Dictionary 线程不安全实例代码
C# Dictionary 是线程不安全的,这意味着多线程操作一个共享的Dictionary实例会有问题
不安全代码如下:
class _20210306_4 { public void Run() { CancellationTokenSource cts = new CancellationTokenSource(); Dictionary<string,object> dics = new Dictionary<string, object>(); for(int i = 1; i < 10; i++) { Task.Run(() => Add(dics,new Random(), cts.Token)); } cts.CancelAfter(TimeSpan.FromSeconds(10)); } public void Add(Dictionary<string,object>dics, Random ran,CancellationToken token) { if (dics == null) return; while (!token.IsCancellationRequested) { string key = ran.Next(1, 10).ToString(); if (!dics.ContainsKey(key)) // 线程不安全处 { dics.Add(key, key); } } } }
测试代码:
var obj = new _20210306_4(); obj.Run(); Console.ReadKey(); // 等待后台线程完成
运行结果:
解决方法:
1)使用lock同步代码
2)使用线程安全的ConcurrentDictionary替换掉Dictionary