1. 程式人生 > >Java Volatile關鍵字使用

Java Volatile關鍵字使用

首先我們先來說說volatile具有的特性,volatile修飾的變數具備可見性,但是對複合操作不保證原子性。這是最顯著的特點,volatile的特性關係到Java記憶體模型以及編譯器、處理器重排序等知識點,這些需要讀者自己去花時間瞭解,我這裡是作高度總結,不會講述其中的細節原理。我們知道,編譯器和處理器會對程式的執行作重排序操作以提高執行效率,對於單執行緒執行,重排序需要遵循as-if-serial規則,使單執行緒程式重排序執行和順序執行的結果一樣,對於多執行緒執行,Java規定了happen-before規則,一定程度上保證了多執行緒併發的安全,為Java程式設計師編寫執行緒安全程式提供了極大便利,volatile應該就屬於happen-before的規則之下,happen-before規定:執行時,對一個volatile域的寫,一定happens-before後續對這個volatile域的讀。其實這說的就是可見性,只是是從更貼近實現的角度說的。下面來說說volatile的實際應用場合。

1、狀態標記

可能的虛擬碼如下:

volatile boolean stop = false;

public void stop(){
    stop = true;
}

public void doWork(){
    if (!stop){
        ......    
    }
}