首頁 > Java > Java基礎 > java中volatile的作用是什麼

java中volatile的作用是什麼

coldplay.xixi
發布: 2023-01-13 00:39:48
原創
28270 人瀏覽過

java中volatile的作用:1、Java提供了volatile關鍵字來保證可見性;2、保證有序性,代碼為【context = loadContext();inited = true;】;3、提供double check。

java中volatile的作用是什麼

本教學操作環境:windows7系統、java10版,DELL G3電腦,此方法適用於所有品牌電腦。

相關免費學習推薦:java基礎教學

#java中volatile的作用:

1、可見性:Java提供了volatile關鍵字來保證可見性。

  當一個共享變數被volatile修飾時,它會保證修改的值會立即被更新到主存,當有其他執行緒需要讀取時,它會去記憶體中讀取新值。

  而普通的共享變數無法保證可見性,因為普通共享變數被修改之後,什麼時候被寫入主存是不確定的,當其他執行緒去讀取時,此時記憶體中可能還是原來的舊值,因此無法保證可見性。

  另外,透過synchronized和Lock也能夠保證可見性,synchronized和Lock能保證同一時刻只有一個執行緒取得鎖定然後執行同步程式碼,並且在釋放鎖定之前會將變數的修改刷新到主存當中。因此可以保證可見性。

先看一段程式碼,假如執行緒1先執行,執行緒2後執行:

//线程1
boolean stop = false;
while(!stop){
doSomething();
}
//线程2
stop = true;
登入後複製

  這段程式碼是很典型的一段程式碼,很多人在中斷執行緒時可能都會採用這種標記辦法。但事實上,這段程式碼會完全運行正確麼?即一定會將線程中斷麼?不一定,也許在大多數時候,這個程式碼能夠把線程中斷,但是也有可能會導致無法中斷線程(雖然這個可能性很小,但是只要一旦發生這種情況就會造成死循環了)。

  以下解釋這段程式碼為何有可能導致無法中斷執行緒。在前面已經解釋過,每個線程在運行過程中都有自己的工作內存,那麼線程1在運行的時候,會將stop變量的值拷貝一份放在自己的工作內存當中。

  那麼當線程2更改了stop變數的值之後,但是還沒來得及寫入主存當中,線程2轉去做其他事情了,那麼線程1由於不知道線程2對stop變數的更改,因此還會一直循環下去。

  但是用volatile修飾之後就變得不一樣了:

  第一:使用volatile關鍵字會強制將修改的值立即寫入主記憶體;

  第二:使用volatile關鍵字的話,當執行緒2進行修改時,會導致執行緒1的工作記憶體中快取變數stop的快取行無效(反映到硬體層的話,就是CPU的L1或L2快取中對應的快取行無效);

  第三:由於線程1的工作記憶體中快取變數stop的快取行無效,所以執行緒1再次讀取變數stop的值時會去主記憶體讀取。

  那麼在線程2修改stop值時(當然這裡包括2個操作,修改線程2工作內存中的值,然後將修改後的值寫入內存),會使得線程1的工作內存中快取變數stop的快取行無效,然後執行緒1讀取時,發現自己的快取行無效,它會等待快取行對應的主記憶體位址被更新之後,然後去對應的主記憶體讀取最新的值。

  那麼執行緒1讀取到的就是最新的正確的值。

2、保證有序性

volatile boolean inited = false;
//线程1:
context = loadContext(); 
inited = true; 
//线程2:
while(!inited ){
sleep()
}
doSomethingwithconfig(context);
登入後複製

確保context已經初始化完成。

3、double check

class Singleton{
private volatile static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if(instance==null) {
synchronized (Singleton.class) {
if(instance==null)
instance = new Singleton();
}
}
return instance;
}
}
登入後複製

以上是java中volatile的作用是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板