一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - 詳解java如何正確使用volatile

詳解java如何正確使用volatile

2021-05-14 10:39nethackatschool Java教程

這篇文章給大家分享了java如何正確使用volatile的相關知識點內容,有興趣的朋友可以參考學習下。

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

可見性

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

詳解java如何正確使用volatile

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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();
 }
}

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

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

* 在變量運算不依賴當前值

* 變量不需要與其他狀態變量共同參與不變約束

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

原文鏈接:https://blog.csdn.net/nethackatschool/article/details/70195719

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久性生大片免费观看性 | 日本高清在线精品一区二区三区 | 欧美a级在线观看 | 韩国情事伦理片观看地址 | 国产精品免费看香蕉 | 亚洲天堂成人在线 | 欧美久久一区二区三区 | 男人都懂www深夜免费网站 | 亚洲精品色婷婷在线影院麻豆 | 婷婷伊人综合亚洲综合网 | www.色姐姐| 国产乱妇无码大片在线观看 | 国产一级特黄aa大片在线 | 久久综合狠狠综合狠狠 | 久久久久久免费高清电影 | 国产成人综合一区精品 | 精品视频免费 | 日本一区二区视频在线 | 99香蕉网| 国产午夜免费秋霞影院 | 校花被老头夺去第一次动图 | xxxxxx日本处大片免费看 | 91麻豆制片厂 | 91精品国产高清久久久久 | 韩国三级在线播放 | 色综久久天天综合绕视看 | 亚洲成av人片天堂网 | 91香蕉依人综合久久 | 国产a一级毛片爽爽影院 | 超h 超重口 高h 污肉1v1 | 青青青久久久 | 久久综久久美利坚合众国 | 免费aⅴ片| 天堂久久久久va久久久久 | 小早川怜子在线播放精品 | 午夜影院免费观看视频 | 久久精品热99看 | 精品国产一级在线观看 | 欧美成狂野欧美在线观看 | 香蕉免费一区二区三区在线观看 | 免费的强动漫人物的 |