文章最後更新於 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會員,超過十年的工作經驗,服務過Yahoo關鍵字廣告業務部門、電子商務及搜尋部門,喜歡彈吉他玩音樂,也喜歡投資美股、虛擬貨幣,樂於與人分享交流!
最新文章
- 2024 年 8 月 26 日Java如何在 Java Spring Boot 中輕鬆使用 @Cacheable 提高應用效能
- 2024 年 8 月 25 日技術文章新手必看:MongoDB 實用入門指南 – 從零開始學習 NoSQL 數據庫
- 2024 年 7 月 18 日未分類ChatGPT, Claude AI 進階提示詞技巧:掌握AI對話的藝術 (Prompt Engineering)
- 2024 年 6 月 11 日程式設計Java 中的 volatile
如果對文章內容有任何問題,歡迎在底下留言讓我知道。
如果你喜歡我的文章,可以按分享按鈕,讓更多的人看見我的文章。
網友留言