來(lái)源: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宰僧。
至此材彪,疑問解開。