項目中出了個 BUG,就在我眼皮子底下,很明顯的一個 BUG,愣是看了兩天才看出來。
我有多個任務併發,任務執行完成後都有一個返回結果,我用一個 List
將結果收集起來,等所有任務完成後,發送出去。結果一直 丟數據。
我反覆檢查邏輯都沒有問題,最後恍然 List
是非線程安全的。
大家都知道 List
是非線程安全的,但是如果僅有 Add
操作呢?估計有些人就會認爲沒問題。
下面的代碼,期望輸出的結果是 1000,然而,註釋掉 lock
後,結果就不一樣了。
class Program
{
static List<Person> persons;
static void Main(string[] args)
{
persons = new List<Person>();
object sync = new object();
Parallel.For(0, 1000, (i) =>
{
Person person = new Person
{
ID = i,
Name = "name" + i
};
lock (sync)
persons.Add(person);
});
Console.WriteLine(persons.Count);
Console.ReadLine();
}
class Person
{
public int ID { get; set; }
public string Name { get; set; }
}
}