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