| 特性 | 說明 |
| 可見性 | 一個線程寫入volatile變量,對其他線程立即可見(禁止指令重排、強制刷新到主內存) |
| 有序性 | volatile讀寫操作前後的指令不會被重排序(內存屏障) |
| 不保證原子性 | 對volatile變量的復合操作(如`i++`)仍非線程安全 |
為什麼嵌入式開發常提volatile?
回答中提到的「嵌入式讀取寄存器」是C/C++中volatile的典型應用場景:防止編譯器優化掉對內存映射寄存器的重複讀取。但Java的volatile語義更強,不僅防編譯器優化,還插入CPU內存屏障保證多核可見性。
正確驗證volatile效果的測試代碼
public class VolatileVisibilityTest {
// 去掉volatile,reader線程可能永遠看不到writer的更新(JIT優化為常量)
private static volatile boolean ready = false;
private static int number = 0;
public static void main(String[] args) throws InterruptedException {
Thread reader = new Thread(() -> {
while (!ready) { /* busy wait */ }
System.out.println("number = " + number); // 應輸出 42
});
Thread writer = new Thread(() -> {
number = 42;
ready = true; // volatile寫入,建立happens-before關係
});
reader.start();
writer.start();
reader.join();
writer.join();
}
}
運行多次,去掉volatile時程序可能卡死在while循環(JIT將`ready`優化為寄存器常量),加上volatile則必能正常退出並打印42。
總結
- volatile是Java多線程編程的基石之一,配合CAS實現無鎖並發(如`AtomicInteger`)
- JDK 1.8對volatile語義無任何削弱,反而通過JIT優化提升了性能
- 學習建議:深入理解JMM(Java內存模型)中的happens-before規則,而非依賴直覺測試
- 上一篇文章: C++二叉樹課程設計:前中後序遍歷、葉子節點統計、節點總數與深度計算
- 下一篇文章: Android Notification多按鈕點擊事件衝突解決:PendingIntent區分請求碼
Copyright ©
程式碼之家 All Rights Reserved