下面的代码是如何自动线程安全的
本文关键字:何自动 线程 安全 代码 | 更新日期: 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>
并在你去的时候构造你的字符串,那么第二个任务可能会在第一个任务完成之前开始。