文章最後更新於 2024 年 6 月 11 日
簡介
volatile 是 Java 中的一個關鍵字,用於修飾變數。它的主要作用是確保變數在多執行緒環境中的可見性和有序性。
主要特性
- 可見性:當一個變數被聲明為
volatile時,對該變數的讀寫操作將直接反映在主記憶體中。這意味著一個執行緒對volatile變數的修改對其他執行緒立即可見。 - 有序性:
volatile關鍵字還能防止指令重排序。這意味著在讀寫volatile變數時,不會將該操作與之前或之後的操作重新排序。
使用範例
以下是使用 volatile 關鍵字的範例:
public class VolatileExample {
private volatile boolean flag = false;
public void writer() {
flag = true; // 寫操作
}
public void reader() {
if (flag) {
// 讀操作,能夠立即看到 flag 的變化
System.out.println("Flag has been set to true");
}
}
public static void main(String[] args) throws InterruptedException {
VolatileExample example = new VolatileExample();
Thread writerThread = new Thread(example::writer);
Thread readerThread = new Thread(example::reader);
writerThread.start();
writerThread.join(); // 確保 writerThread 完成
readerThread.start();
readerThread.join(); // 確保 readerThread 完成
}
}
在這個範例中,flag 被聲明為 volatile。當 writerThread 設置 flag 為 true 時,readerThread 能夠立即看到這個變化並輸出 "Flag has been set to true"。
volatile vs synchronized
| 特性 | volatile | synchronized |
|---|---|---|
| 可見性 | 是 | 是 |
| 有序性 | 是 | 是 |
| 原子性 | 否 | 是(對整個臨界區域) |
| 性能 | 高(適用於簡單的狀態標誌) | 低(可能導致阻塞) |
| 使用場景 | 簡單的狀態標誌,避免指令重排序 | 複雜的邏輯和需要原子性操作的代碼區塊 |
適用場景
- 狀態標誌:適用於簡單的 boolean 標誌,用於多執行緒之間的通信。
- 單例模式(Double-Checked Locking):在雙重檢查鎖的實現中,用於標誌實例是否已經初始化。
不適用場景
- 複雜的邏輯操作:如果變數需要複雜的邏輯操作(如增減),則應該使用
synchronized來確保原子性。 - 非原子性操作:
volatile無法確保操作的原子性,例如i++。
注意事項
volatile不適用於解決所有的並發問題。對於需要原子性操作的場景,應該使用更高級的同步機制(如synchronized或Lock)。
關於作者

-
大家好,我是 Oscar(卡哥)。曾任 Yahoo 資深工程師(Lead Engineer),也是高智商組織 Mensa 的會員,擁有超過 15 年的軟體開發經驗。職涯中曾參與 Yahoo 關鍵字廣告、電子商務與搜尋相關專案,近年則在虛擬貨幣交易所專注於大數據與 AI 資料服務,帶領團隊開發具影響力的產品與解決方案。
在工作之外,我熱愛音樂,平時喜歡彈吉他、創作與演奏;運動方面偏好羽球、高爾夫球,也投入在美股與虛擬貨幣的投資領域。最享受的,是透過交流與分享,把知識與經驗轉化成更多可能性。
最新文章
- 2026 年 7 月 5 日高併發系統設計服務韌性設計模式:Bulkhead、RateLimiter 與更多
- 2025 年 10 月 12 日Scrum 方法論為什麼 Scrum 團隊會失敗?——從「儀式」回到「實戰」的長期觀察與修復手冊
- 2025 年 8 月 17 日軟體開發最佳實踐【軟體開發必讀】程式人生中的七大浪費:你是不是天天在做白工?
- 2025 年 2 月 8 日人工智能(AI)高效使用DeepSeek R1的7個核心技巧與地雷提示詞解析|2025實戰指南