volatile關鍵字解析~高階java必問
昨天我介紹了原子性、可見性、有序性的概念,那麼今天就來見識下這些概念的主角-volatile關鍵字。
volatile基本介紹
volatile可以看成是synchronized的一種輕量級的實現,但volatile並不能完全代替synchronized,volatile有synchronized可見性的特性,但沒有synchronized原子性的特性。可見性即用volatile關鍵字修飾的成員變數表明該變數不存在工作執行緒的副本,執行緒每次直接都從主記憶體中讀取,每次讀取的都是最新的值,這也就保證了變數對其他執行緒的可見性。另外,使用volatile還能確保變數不能被重排序,保證了有序性。
volatile只用修飾一個成員變數,如:private volatile balance;
volatile比synchronized程式設計更容易且開銷更小,但具有一點的使用侷限性,使用要相當小心,不能當鎖使用。volatile不會像synchronized一樣阻塞程式,如果是讀操作遠多於寫操作的情況可以建議使用volatile,它會有更好的效能。
volatile使用場景
如果正確使用volatile的話,必須依賴下以下種條件:
1、對變數的寫操作不依賴當前變數的值;
2、該變數沒有包含在其他變數的不變式中。
第1個條件就說明了volatile不是原子性的操作,不能使用n++類似的計數器,它不是執行緒安全的。
1、狀態的改變
有些場景肯定會有狀態的改變,完成一個主執行緒的停止等。首先我們開啟了一個無限迴圈的主執行緒,判斷變數isStop變數是否為true,如果true的話就退出程式,否則就一直迴圈,所以這個isStop的值是別的執行緒改變的。
上面這段程式如果不加volatile的話會一直卡在迴圈,此時的執行緒拿到的值永遠為false,加了volatile3秒後就輸出stop,所以這段程式很好的解釋了可見性的特點。
2、讀多寫少的情況
假設這樣一種場景,有N個執行緒在讀取變數的值,只有一個執行緒寫變數的值,這時候就能保證讀執行緒的可見性,又能保證寫執行緒的執行緒安全問題。
像n++不是原子類的操作,其實可以通過synchronized對寫方法鎖住,再用volatile修飾變數,這樣就保證了讀執行緒對變數的可見性,又保證了變數的原子性。
如果n不加volatile,程式將一直迴圈,不能輸出stop,也就是此時的執行緒拿到的值永遠為0。當然不加volatile,對獲取n的方法進行synchronized修飾也是能及時獲取最新值的,但是效能會遠低於volatile。
相關文章
- Java volatile關鍵字解析Java
- Java併發—— 關鍵字volatile解析Java
- volatile關鍵字解析
- 深入解析volatile關鍵字
- Java volatile關鍵字作用Java
- Java併發程式設計:volatile關鍵字解析Java程式設計
- Java之併發程式設計:volatile關鍵字解析Java程式設計
- 從根源上解析 Java volatile 關鍵字的實現Java
- Java關鍵字volatile的理解Java
- Java面試官最愛問的volatile關鍵字Java面試
- Volatile關鍵字
- java併發之volatile關鍵字Java
- Java 面試官最喜歡問的關鍵字 volatileJava面試
- Java記憶體模型——volatile關鍵字Java記憶體模型
- 深入瞭解 Java 的 volatile 關鍵字Java
- Java併發程式設計volatile關鍵字Java程式設計
- 深入理解Java中的volatile關鍵字Java
- Java多執行緒(二)volatile關鍵字Java執行緒
- java併發程式設計——volatile關鍵字Java程式設計
- java記憶體模型及volatile關鍵字Java記憶體模型
- java併發程式設計:volatile關鍵字Java程式設計
- Java面試題集錦(1):volatile關鍵字Java面試題
- 深入彙編指令理解Java關鍵字volatileJava
- java多執行緒4:volatile關鍵字Java執行緒
- Java記憶體模型與volatile關鍵字Java記憶體模型
- Java進階——super關鍵字Java
- 快速理解 volatile 關鍵字
- Java面試題:請談談Java中的volatile關鍵字?Java面試題
- 兩張圖理解volatile關鍵字
- volatile關鍵字的作用、原理
- Java併發——關鍵字synchronized解析Javasynchronized
- Java中的static關鍵字解析Java
- Java多執行緒學習(三)volatile關鍵字Java執行緒
- 就是要你懂Java中volatile關鍵字實現原理Java
- Java高併發之synchronized關鍵字Javasynchronized
- 一個具體的例子學習Java volatile關鍵字Java
- Java併發專題(三)深入理解volatile關鍵字Java
- 全面理解Java記憶體模型(JMM)及volatile關鍵字Java記憶體模型