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

 

posted @ 2021-03-06 16:55  温故纳新  阅读(703)  评论(0编辑  收藏  举报