zoukankan      html  css  js  c++  java
  • 【C#】List 并发丢数据问题

    项目中出了个 BUG,就在我眼皮子底下,很明显的一个 BUG,愣是看了两天才看出来。

    我有多个任务并发,任务执行完成后都有一个返回结果,我用一个 List 将结果收集起来,等所有任务完成后,发送出去。结果一直 丢数据

    我反复检查逻辑都没有问题,最后恍然 List 是非线程安全的。

    大家都知道 List 是非线程安全的,但是如果仅有 Add 操作呢?估计有些人就会认为没问题。

    下面的代码,期望输出的结果是 1000,然而,注释掉 lock 后,结果就不一样了。

    class Program
    {
        static List<Person> persons;
    
        static void Main(string[] args)
        {
            persons = new List<Person>();
    
            object sync = new object();
    
            Parallel.For(0, 1000, (i) =>
            {
                Person person = new Person
                {
                    ID = i,
                    Name = "name" + i
                };
                lock (sync)
                    persons.Add(person);
            });
    
            Console.WriteLine(persons.Count);
            Console.ReadLine();
        }
    
        class Person
        {
            public int ID { get; set; }
            public string Name { get; set; }
        }
    }
    

    ------------------------------------ END ------------------------------------

    欢迎扫码关注我的公众号


    码农升级
  • 相关阅读:
    cstc2018 混合果汁
    CF1086E Beautiful Matrix
    AT2000 Leftmost Ball
    CF1208E Let Them Slide
    CF1208D Restore Permutation
    【置顶】博客公告
    [NOI2015]软件包管理器
    【noip2018】积木大赛
    几天连测总结
    【ZJOI2007】棋盘制作
  • 原文地址:https://www.cnblogs.com/gl1573/p/14392108.html
Copyright © 2011-2022 走看看