單純使用 volatile 關(guān)鍵字是不能保證線程安全的
1. volatile 只提供了一種弱的同步機(jī)制,用來(lái)確保將變量的更新操作通知到其他線程
2. volatile 語(yǔ)義是禁用 CPU 緩存,直接從主內(nèi)存讀、寫變量。表現(xiàn)為:更新 volatile 變量時(shí),JMM 會(huì)把線程對(duì)應(yīng)的本地內(nèi)存中的共享變量值刷新到主內(nèi)存中;讀 volatile 變量時(shí),JMM 會(huì)把線程對(duì)應(yīng)的本地內(nèi)存設(shè)置為無(wú)效,直接從主內(nèi)存中讀取共享變量
3. 當(dāng)把變量聲明為 volatile 類型后,JVM 增加內(nèi)存屏障,禁止 CPU 進(jìn)行指令重排