java正確使用volatile的方法-創(chuàng)新互聯(lián)

這篇文章主要介紹了java正確使用volatile的方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的皇姑網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

volatile關(guān)鍵字在java多線程中有著比較重要作用,volatile主要作用是可以保持變量在多線程中是實時可見的,是java中提供的最輕量的同步機制。

可見性

在Java的內(nèi)存模型中所有的的變量(這里的變量是類全局變量,并不是局部變量,局部變量在方法內(nèi)并沒有線程安全的問題,因為變量隨方法調(diào)用完成而銷毀)都是存放在主內(nèi)存中的,而每個線程有自己的工作內(nèi)存,每次線程執(zhí)行時,會從主內(nèi)存獲取變量的拷貝,對變量的操作都在線程的工作內(nèi)存中進行,不同線程之間也不能共享工作內(nèi)存,只能從主內(nèi)存讀取變量的拷貝。具體可以通過下圖來表示:

java正確使用volatile的方法

然而對于volatile(使用synchronized/final修飾都具有可見性)來說打破了上述的規(guī)則,即當(dāng)線程修改了變量的值,其他線程可以立即知道該變量的改變。然而對于普通變量來說,當(dāng)一個線程修改了變量,需要先將變量寫回主內(nèi)存,其他線程從主內(nèi)存讀取變量后才對該線程可見。似乎從以上的描述可以推導(dǎo)出只要使用volatile修飾的變量就可以保證該變量在多線程環(huán)境下操作是安全的,因為它對于所有線程的工作內(nèi)存都是可見的也就是說一致的。這么理解確實沒錯,但是在java中很多運算都不是原子的,所以在java的一些運算中使用volatile并不能保證線程安全問題。讓我們來看一個例子:

public class test{
private static volatile t=0;
 private static int add(){
  return t++;
 }

 public static void testVolatile(){
  for (int i=0;i<20;i++){
   Thread thread=new Thread(()-> {
    for (int j=0;j<1000;j++) {
     add();
    }
   });
   thread.start();
  }
  while (Thread.activeCount()>1){
   Thread.yield();
  }
  System.out.println(t);
 }

 public static void main(String[] args){
  testVolatile();
 }
}

預(yù)期這個t值應(yīng)該是20000,但是會出現(xiàn)t值小于20000的情況,原因大家應(yīng)該猜到了,問題出在t++上,t++并不是一個原子操作,t++的操作在java中代表先獲取t值,再加1,再賦值還t。在獲取t值時因為是volatile修飾的,所以可以獲取線程最新值,然而在加1的時候就不能保證了,有可能其他線程已經(jīng)加1了。

那么什么場景使用volatile是最合適的呢?

* 在變量運算不依賴當(dāng)前值

* 變量不需要與其他狀態(tài)變量共同參與不變約束

翻譯成中文就是對于那些在多線程中既有讀又有寫的變量,完全可以使用volatile修飾,這樣就對于讀操作就不要使用lock/synchronized比較重的操作了,直接讀就是,因為變量是可見的。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“java正確使用volatile的方法”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

網(wǎng)站欄目:java正確使用volatile的方法-創(chuàng)新互聯(lián)
瀏覽路徑:http://muchs.cn/article0/ddhoio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、移動網(wǎng)站建設(shè)、網(wǎng)站排名自適應(yīng)網(wǎng)站、網(wǎng)站內(nèi)鏈ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司