Console.WriteLine對(duì)線程同步的影響

來源: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)部是同步輸出的(SO1SO2)??蛇@不是我想要的。。。

實(shí)在沒辦法了,求助群友,然后某位群友給出了反例,如下圖:

thread-console02

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

至此,疑問解開。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容