問題:volatile關鍵字有什么用
在工作的時候,我碰到了volatile關鍵字。但是我不是非常了解它。我發現了這個解釋
這篇文章已經解釋了問題中的關鍵字的細節了,你們曾經用過它嗎或者見過正確使用這個關鍵字的樣例
回答
-
Java中同步的實現大多是通過關鍵字synchronized和volatile和鎖
-
在Java里面,我們沒有 synchronized 的變量。對一個變量使用 synchronized 關鍵字是非法的,會導致編譯錯誤的。我們可以使用volatile變量而不是synchronized變量,volatile變量會讓JVM里面的線程去主存中讀取volatile 變量的值并且不在本地副本里面緩存
-
如果一個變量沒有被多個線程共享,那就不需要使用volatile關鍵字了。
volatile使用的例子:
public class Singleton {private static volatile Singleton _instance; // volatile variablepublic static Singleton getInstance() {if (_instance == null) {synchronized (Singleton.class) {if (_instance == null)_instance = new Singleton();}}return _instance;}
}
我們在第一次使用的時候才創建這個實例
如果我們沒有給這個變量加volatile,那么創建單例的那個線程就沒辦法和其他線程通信。如果線程A在創建一個單例,在創建完單例以后,cpu炸了,那么其他線程就看不到這個實例了,它們就覺得這個實例還是空的。
為什么會發生這種情況?因為讀線程沒有加鎖,直到寫線程來到了同步代碼塊,內存沒有被同步,實例的值還未被刷新到主存里。在 Volatile關鍵字以后,這就由Java自身處理,這樣的更新是對所有的讀線程可見的
Conclusion: volatile 關鍵字也可以用于多個線程在主存的通信
不使用volatile的例子:
public class Singleton{ private static Singleton _instance; //without volatile variablepublic static Singleton getInstance(){ if(_instance == null){ synchronized(Singleton.class){ if(_instance == null) _instance = new Singleton(); } } return _instance; }
文章翻譯自Stack Overflow:https://stackoverflow.com/questions/106591/what-is-the-volatile-keyword-useful-for