volatile关键字有什么用
問題:volatile關(guān)鍵字有什么用
在工作的時(shí)候,我碰到了volatile關(guān)鍵字。但是我不是非常了解它。我發(fā)現(xiàn)了這個(gè)解釋
這篇文章已經(jīng)解釋了問題中的關(guān)鍵字的細(xì)節(jié)了,你們?cè)?jīng)用過它嗎或者見過正確使用這個(gè)關(guān)鍵字的樣例
回答
Java中同步的實(shí)現(xiàn)大多是通過關(guān)鍵字synchronized和volatile和鎖
在Java里面,我們沒有 synchronized 的變量。對(duì)一個(gè)變量使用 synchronized 關(guān)鍵字是非法的,會(huì)導(dǎo)致編譯錯(cuò)誤的。我們可以使用volatile變量而不是synchronized變量,volatile變量會(huì)讓JVM里面的線程去主存中讀取volatile 變量的值并且不在本地副本里面緩存
如果一個(gè)變量沒有被多個(gè)線程共享,那就不需要使用volatile關(guān)鍵字了。
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;} }我們?cè)诘谝淮问褂玫臅r(shí)候才創(chuàng)建這個(gè)實(shí)例
如果我們沒有給這個(gè)變量加volatile,那么創(chuàng)建單例的那個(gè)線程就沒辦法和其他線程通信。如果線程A在創(chuàng)建一個(gè)單例,在創(chuàng)建完單例以后,cpu炸了,那么其他線程就看不到這個(gè)實(shí)例了,它們就覺得這個(gè)實(shí)例還是空的。
為什么會(huì)發(fā)生這種情況?因?yàn)樽x線程沒有加鎖,直到寫線程來到了同步代碼塊,內(nèi)存沒有被同步,實(shí)例的值還未被刷新到主存里。在 Volatile關(guān)鍵字以后,這就由Java自身處理,這樣的更新是對(duì)所有的讀線程可見的
Conclusion: volatile 關(guān)鍵字也可以用于多個(gè)線程在主存的通信
不使用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
總結(jié)
以上是生活随笔為你收集整理的volatile关键字有什么用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到老鼠被猫吃了什么意思
- 下一篇: ConcurrentHashMap和Co