1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
但為什么?flag不是易失性的,為什么它的值會(huì)立即更新?總是!
你只是幸運(yùn)而已;或不幸,取決于你的觀點(diǎn)。我在 Ideone 上嘗試了這個(gè),發(fā)現(xiàn)它超時(shí)而不是正常終止。
請(qǐng)記?。簾o(wú)法觀察到并發(fā)錯(cuò)誤并不等同于不存在并發(fā)錯(cuò)誤。
您對(duì)代碼最有把握的是,根據(jù)規(guī)范,您可以證明不存在錯(cuò)誤。這并不意味著代碼就能正常工作;而是意味著代碼可以正常工作。這只是意味著問(wèn)題出在 JVM 實(shí)現(xiàn)上。
特別是,您無(wú)法證明此代碼將正常工作,因?yàn)榈诙€(gè)線程中的寫(xiě)入與第一個(gè)線程中的讀取之間不存在發(fā)生之前關(guān)系。flag
添加volatile
創(chuàng)建了這種保證,因?yàn)橐资詫?xiě)入發(fā)生在易失性讀取之前。
這并不是說(shuō)沒(méi)有 volatile 就永遠(yuǎn)無(wú)法工作,只是不能保證:JVM 只需要至少按照規(guī)范要求的頻率刷新線程的緩存值,但可以更頻繁地執(zhí)行此操作,或者實(shí)際上根本不緩存值。
添加回答
舉報(bào)