ConcurrentBag執行緒安全,List執行緒不安全,示例
阿新 • • 發佈:2022-04-20
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每次執行結果都不盡相同,體現了其多執行緒的不安全性