异步与并行~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对象的安全,同时也保证了结果的正确性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示