下面的代码是如何自动线程安全的

本文关键字:何自动 线程 安全 代码 | 更新日期: 2023-09-27 18:11:23

我有以下代码,其中两个线程正在向List中添加新元素。

public class Numbers
        {
            public int number;
            public string threadName;
        }
        static void Main(string[] args)
        {
            List<Numbers> numbers = new List<Numbers>();
            Task t = Task.Factory.StartNew(() => {
                for (int i = 0; i < 999; i++)
                {
                    numbers.Add(new Numbers() { number = i, threadName = "t" });
                }
            });
            Task k = Task.Factory.StartNew(() =>
            {
                for (int i = 0; i < 999; i++)
                {
                    numbers.Add(new Numbers() { number = i, threadName = "k" });
                }
            });

            t.Wait();
            k.Wait();

            StreamWriter writer = new StreamWriter("text.txt");
            foreach (var item in numbers)
            {
                writer.WriteLine(item.threadName + item.number);
            }
            writer.Flush();
            Console.WriteLine("Done!");
            Console.ReadLine();
        }

当我打开文本文件时,我看到它们从k0k1…k999t0t1…t999。但我原以为这份名单是混合的或洗牌的。为什么这两个任务不是随机添加新元素,而是完美排序呢?

下面的代码是如何自动线程安全的

您的任务肯定不是线程安全的,因为它们并发地写入同一个列表。最可能的原因是第一个任务完成得非常快——在第二个任务有机会开始之前,它完成了所有999个对象的写入。

如果您在任务的实现中添加一个随机的短延迟,您将看到结果的一些随机性。让你的任务做更多的工作可能也会增加一些随机性:例如,如果你让你的列表成为List<string>并在你去的时候构造你的字符串,那么第二个任务可能会在第一个任务完成之前开始。