來源:https://note.guoqianfan.com/2021/04/10/Console.WriteLine對(duì)線程同步的影響/
這天群里有人發(fā)了個(gè)圖,說i++是原子性的,然后貼出了代碼。
i++肯定不是原子性的,這我知道,但是圖里的輸出結(jié)果卻是正確的,這就有點(diǎn)問題了。
牽掛了2天,我親自測(cè)試了下,確實(shí)有問題,測(cè)試代碼如下:
int a = 0;
List<Task> tasks3 = new List<Task>();
for (int m = 0; m < 20; m++)
{
Task task = Task.Run(() =>
{
for (int i = 0; i < 600; i++)
{
a = a + 1;
Console.WriteLine("task" + Thread.CurrentThread.ManagedThreadId + ":" + i + $",a:{a}");
}
});
tasks3.Add(task);
}
await Task.WhenAll(tasks3);
Console.WriteLine(a);
Console.ReadKey();
輸出如下圖:

thread-console01
從圖中可以看到結(jié)果是正確的。可是這不對(duì)啊,多線程操作同一變量,結(jié)果肯定是小于預(yù)期值的。加上Console.WriteLine之后,結(jié)果就是正確的了,這有問題。它能讓線程同步?也不對(duì),它與a的操作都不是同一行,怎么能影響到a呢?
搜了下,說多線程調(diào)用Console.WriteLine時(shí),其內(nèi)部是同步輸出的(SO1和SO2)??蛇@不是我想要的。。。
實(shí)在沒辦法了,求助群友,然后某位群友給出了反例,如下圖:

thread-console02
個(gè)人總結(jié):Console.WriteLine讓多線程盡可能的變成了同步,所以a被多線程操作的概率變低,輸出錯(cuò)誤結(jié)果的概率也變得很低了。圖中跑了好久,才差了9。
至此,疑問解開。