异步与并行~List<T>是线程安全的吗?

返回目录

题目有点意思,大家都知道Dictionary<K,V>不是线程安全的类型,而List<T>是线程安全的吗?在今天之前大叔没有去测试过,而就在今天也是一个VIP问我,说在我的代码中使用了并行,然后为一个List赋值,说的直接一点就是:List元素是全局的,在各个线程里分别去操作它,测试数据是1万条,而在测试结果之后,我发展List元素最终的数组是9000多条,也就是说被并发了几千条数据,呵呵,下面咱们看一下源代码吧!

测试代码:

复制代码
     [TestMethod]
        public void TestMethod0()
        {
            List<int> intList = new List<int>();
            var result = Parallel.ForEach(Enumerable.Range(1, 10000), (val) =>
            {
                intList.Add(val);
            });
            if (result.IsCompleted)
            {
                Console.WriteLine("intList.Count():" + intList.Count);
            }
        }
复制代码

咱们看一下单元测试的结果,大叔一直很喜欢这句话:机器最能证明一切!

通过截图我们可以看到,数组的长度并不是1万,而被丢失了一些数组,这就是并发,这就是线程的不安全!

下面大家使用被封装的ConcurrentList线程安全的对象,再进行一下测试:

复制代码
     [TestMethod]
        public void TestMethod1()
        {
            ConcurrentList<int> intList = new ConcurrentList<int>();
            var result = Parallel.ForEach(Enumerable.Range(1, 10000), (val) =>
            {
                intList.Add(val);
            });
            if (result.IsCompleted)
            {
                Console.WriteLine("intList.Count():" + intList.Count);
            }
        }
复制代码

再看一下测试的结果,它与原始的1万条数据是相同的

对于线程安全的类型,多线程并发访问操作List元素时,其它线程被锁定,保证了List对象的安全,同时也保证了结果的正确性。

返回目录

posted @   张占岭  阅读(4904)  评论(12编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示