volatile关键字有什么用
問題: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
總結
以上是生活随笔為你收集整理的volatile关键字有什么用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到老鼠被猫吃了什么意思
- 下一篇: 梦到小孩子结婚怎么回事