1. 程式人生 > 其它 >ConcurrentBag執行緒安全,List執行緒不安全,示例

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每次執行結果都不盡相同,體現了其多執行緒的不安全性