2 回答

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
這是一個(gè)競(jìng)爭(zhēng)條件。
兩個(gè)線程都可以訪問(wèn) sum。
總和+=n;不是原子的
線程 1 讀取 sum 0
線程 2 換入,因?yàn)榇a未同步,讀取 sum 為 0
線程 1 將 100 加到 0 并將其寫(xiě)入總和
線程 2 將 0 加 100 并將其寫(xiě)入總和并覆蓋線程 1 的值

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果您僅根據(jù)代碼中的行來(lái)考慮該程序的并發(fā)性,那么 100/100 的輸出結(jié)果就沒(méi)有意義。但您還必須考慮執(zhí)行這些行時(shí)實(shí)際發(fā)生的指令是什么。每行代碼可以包含很多很多匯編指令。在這種情況下,要添加n
到sum
,真正發(fā)生的是從內(nèi)存中讀取 的值sum
,可能加載到寄存器中,遞增,然后重新寫(xiě)入內(nèi)存中。
100/100 輸出可能發(fā)生在以下場(chǎng)景中。假設(shè)線程 1 和線程 2 都調(diào)用bank.add(100)
,并且銀行異步處理請(qǐng)求。也就是說(shuō),銀行有一個(gè)線程處理每個(gè)請(qǐng)求。
然后,該組的線程 1 加載 的值sum
,該值為零。線程 2 還加載了緊隨其后的值sum
,該值仍然為零。然后,線程 1 獲取它加載的值,添加n=100
,并將其寫(xiě)入內(nèi)存。線程2做同樣的事;它采用之前加載的 sum 值 0,加上 100,然后將其寫(xiě)回內(nèi)存。然后,他們各自打印出 100 的值。
添加回答
舉報(bào)