ConcurrentBag线程安全,List线程不安全,示例
class Program { static void Main(string[] args) { ListTest(); ConcurrentBagTest(); } public static void ConcurrentBagTest() { ConcurrentBag<int> bag = new ConcurrentBag<int>(); List<Task> taskList = new List<Task>(); for (int i = 0; i < 100; i++) { int numberToAdd = i; taskList.Add(Task.Run(() => bag.Add(numberToAdd))); } Task.WaitAll(taskList.ToArray()); List<Task> consumeTaskList = new List<Task>(); int count = 0; while (!bag.IsEmpty) { consumeTaskList.Add(Task.Run(() => { int temp; if (bag.TryTake(out temp)) { Console.Write(temp+","); count++; } } )); } Task.WaitAll(consumeTaskList.ToArray()); Console.WriteLine(); Console.WriteLine($"ConcurrentBag中元素个数{count}"); int unexpectedItem; if (bag.TryTake(out unexpectedItem)) Console.WriteLine($"ConcurrentBag中元素{unexpectedItem}"); } public static void ListTest() { List<int> list = new List<int>(); List<Task> taskList = new List<Task>(); for (int i = 0; i < 100; i++) { int numberToAdd = i; taskList.Add(Task.Run(() => list.Add(numberToAdd))); } Task.WaitAll(taskList.ToArray()); for (int i = 0; i < list.Count; i++) { Console.Write(list[i]+","); } Console.WriteLine(); Console.WriteLine($"list中元素个数{list.Count}"); Console.WriteLine("--------------------------------"); } }
List每次运行结果都不尽相同,体现了其多线程的不安全性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律