我有以下代碼,其中兩個線程正在列表中添加新元素。下面的代碼是如何自動線程安全的?
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。但是我期待這份清單能夠混合或混洗。爲什麼這兩項任務不是以隨機方式添加新元素,而是完全排序?
可能是因爲你的任務很快完成了,第一個完成之前就完成了第二個任務?不是'List'無論如何都不是線程安全的,所以只要你讓兩個任務真正並行運行,你就會從Add()拋出異常。 –
CodeCaster
@CodeCaster你永遠是對的。添加元素後,我添加了一個小線程睡眠,是的,他們是不可預知的。 – ozgur