兩個線程並發讀寫共享變量 int i,未加 volatile 時輸出交錯且數值「跳躍」;加上 volatile 後,雙線程輸出嚴格遞增、交替有序。
Thread.sleep(10) 觸發上下文切換,間接促使緩存同步,製造「看似正常」的輸出假象。| 適用 | 不適用 |
|---|---|
狀態標誌位(volatile boolean flag) | 複合操作(i++、check-then-act)需配合 synchronized/CAS |
| 單次寫入、多次讀取的配置變量 | 需原子性的長整型/雙精度(64位非原子寫入) |
| DCL 單例模式中的實例引用 | 替代鎖實現複雜同步邏輯 |
java.util.concurrent.atomic 原子類(AtomicInteger 等)替代 volatile + CAS 手寫邏輯。synchronized 或 Lock 解決複合操作原子性問題。結論:volatile 是輕量級同步工具,核心解決「可見性」與「有序性」,但**不保證原子性**。正確使用需結合業務場景與 JMM 模型深度理解。