一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

java內存模型——volatile的可見性

來源:CSDN 時間:2023-03-17 10:27:33

volatile的使用與線程安全關系密切,主要作用是使變量在多個線程間可見,另外也有防止指令重排的作用。


(相關資料圖)

比如主內存中有變量a=0,線程1設置a=10,線程2再操作a的時候,是以a=10的基礎上進行操作,否則會影響邏輯!

0 1volatile的可見性

要了解volatile的可見性,首先得了解java內存模型:

java內存模型

Java內存模型由Java虛擬機規范定義,用來屏蔽各個平臺的硬件差異。簡單來說:

1. 所有變量儲存在主內存。

2. 每條線程擁有自己的工作內存,其中保存了主內存中線程使用到的變量的副本。

3. 線程不能直接讀寫主內存中的變量,所有操作均在工作內存中完成。

線程,主內存,工作內存的交互關系如下圖所示

如下列代碼所示,rt啟動之后修改isRunning的值為false,此時while循環不會停止,因為run方法里得不到改變之后的isRunning。

解決:使用volatile修飾isRunning,這樣當isRunning的值改變之后,會立即刷新到主內存里,工作內存也能立即獲取到新的值

public class RunThread extends Thread {private boolean isRunning = true;  private void setRunning(boolean isRunning){this.isRunning = isRunning;  }    public void run () {System.out.println("進入run方法");    while(isRunning == true){//...    }    System.out.println("線程停止");  }  public static void main(String[] args) {RunThread rt = new RunThread();    rt.start();    try {Thread.sleep(3000);      rt.setRunning(false);      System.out.println("isRunning的值已經被設置成false");      Thread.sleep(1000);      System.out.println(rt.isRunning);    } catch (InterruptedException e) {// TODO Auto-generated catch block      e.printStackTrace();    }  }}

0 2volatile能防止指令重排

如下列代碼所示,這是單例模式的雙檢鎖寫法

public class SingletonTest {private volatile static SingletonTest instance = null;    private SingletonTest() { }    public static SingletonTest getInstance() {if(instance == null) {synchronized (SingletonTest.class){if(instance == null) {instance = new SingletonTest();  //非原子操作                }            }        }        return instance;    }}

我們看到instance用了volatile修飾,由于 instance = new SingletonTest();可分解為:

1.memory =allocate(); //分配對象的內存空間2.ctorInstance(memory); //初始化對象3.instance =memory; //設置instance指向剛分配的內存地址

操作2依賴1,但是操作3不依賴2,所以有可能出現1,3,2的順序,當出現這種順序的時候,雖然instance不為空,但是對象也有可能沒有正確初始化,會出錯。

而使用volatile修飾instance之后,不會出現亂序的行為!

0 3volatile不保證原子性以及解決方式

1.什么是原子性?

下列語句中,哪些是原子性操作?

x = 10;         //語句1y = x;          //語句2x++;            //語句3x = x + 1;      //語句4

語句1 是直接將數值 10 賦值給 x,也就是說線程執行這個語句的會直接將數值 10 寫入到工作內存中;

語句2 實際上包含兩個操作,它先要去讀取 x 的值,再將 x 的值寫入工作內存。雖然,讀取 x 的值以及 將 x 的值寫入工作內存這兩個操作都是原子性操作,但是合起來就不是原子性操作了;

同樣的,x++ 和 x = x+1 包括3個操作:讀取 x 的值,進行加 1 操作,寫入新的值。

只有 語句1 的操作具備原子性。也就是說,只有簡單的讀取、賦值(而且必須是將數字賦值給某個變量,變量之間的相互賦值不是原子操作)才是原子操作!

2.舉例

如下列代碼所示,使用volatile修飾的變量count,利用10個線程分別對count進行++操作,而根據上面的表述,++操作不是原子操作!每個線程加1000個數,打印的結果中一定有一個是10000才是對的,但是實際上并不是這樣!因為volatile不保證原子性!

public class VolatileNoAtomic extends Thread{private static volatile int count;//  private static AtomicInteger count = new AtomicInteger(0);  private static void addCount(){for (int i = 0; i < 1000; i++) {count ++;//      count.incrementAndGet();    }    System.out.println(count);  }  public void run(){addCount();  }    public static void main(String[] args) {VolatileNoAtomic[] arr = new VolatileNoAtomic[10];    for (int i = 0; i < arr.length; i++) {arr[i] = new VolatileNoAtomic();    }        for (int i = 0; i < arr.length; i++) {arr[i].start();    }  }}

解決:

方法1:使用原子類Atomic類的系列對象,這樣既不會阻塞,又能保證原子性!

方法2:使用synchronized修飾addCount方法,這樣做的話,線程同步之后會有阻塞,運行時間加長,而且volatile將會失效,不建議這么改

方法3:使用Lock加鎖,當然,跟方法2一樣的有阻塞

● 架構系列——使用synchronized需要注意什么細節

● 架構系列——線程實現方式以及生命周期的探索

● 架構系列——并發、并行與多線程關系探索

● 架構系列——單體、分布式、集群與冗余的探索

● Java反射:框架設計的靈魂

● 高并發秒殺系統如何設計與優化

● 要準備多少東西去面試---java中高級面試總結(值得收藏)

● 最近的面試有感(7個方面)

● java中的參數傳遞(只有值傳遞沒有引用傳遞)

● 38張史上最全的IT工程師技能圖譜(高清收藏)

● PLSQL連接本地oracle或遠程oracle數據庫,實現隨意切換(送福利)

● 通過數據泵expdp、impdp方式備份與還原Oracle數據庫--值得收藏

● java常見排序算法--選擇排序、冒泡排序、插入排序分析與比較

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四
久久香蕉国产线看观看网| 午夜精品久久一牛影视| 99re这里只有精品6| 欧美福利网址| 日韩视频久久| 国产精品一区三区| 久久久免费观看视频| 最近中文字幕mv在线一区二区三区四区| 欧美国产日本韩| 亚洲欧洲99久久| 亚洲黄色在线观看| 国产精品久久久久久久9999| 久久婷婷国产综合尤物精品| av成人天堂| 一区国产精品| 国产精品国产三级国产普通话三级 | 欧美高清在线观看| 亚洲天堂成人在线视频| 国产在线精品自拍| 欧美激情在线狂野欧美精品| 亚洲欧美国产另类| 亚洲精品美女在线| 一区二区三区在线看| 国产精品免费网站在线观看| 欧美成人国产一区二区| 亚洲欧美日韩中文视频| 亚洲人成在线播放网站岛国| 国产一区二区日韩| 国产精品久久波多野结衣| 免费日韩一区二区| 久久精品一区二区三区中文字幕| 亚洲免费观看| 亚洲电影免费在线观看| 国产欧美日韩精品a在线观看| 欧美激情在线| 免费成人在线观看视频| 久久精品人人做人人爽电影蜜月| 亚洲一二三区精品| 一区二区三区回区在观看免费视频| 曰本成人黄色| 国内精品久久国产| 国产视频一区在线观看| 国产伦精品一区二区三区高清版 | 亚洲国产电影| 国产午夜精品全部视频播放| 国产精品不卡在线| 欧美午夜无遮挡| 国产精品av一区二区| 欧美日韩亚洲激情| 欧美精品在线极品| 欧美啪啪成人vr| 欧美另类久久久品| 欧美视频二区| 国产精品视频一区二区高潮| 国产精品美女在线观看| 国产精品亚洲аv天堂网| 国产精品午夜av在线| 国产精品久久久久久久电影| 欧美日一区二区在线观看 | 国产精品成人v| 欧美三级在线视频| 国产精品乱码久久久久久| 国产精品久久久久99| 国产精品乱码久久久久久| 国产欧美日韩在线播放| 国产亚洲网站| 亚洲大片免费看| 亚洲乱码视频| 在线性视频日韩欧美| 亚洲天堂成人在线观看| 亚洲男人天堂2024| 久久久91精品国产一区二区精品| 久久久久这里只有精品| 狼人天天伊人久久| 欧美麻豆久久久久久中文| 欧美日韩国产一区二区| 国产精品免费福利| 今天的高清视频免费播放成人 | 欧美亚一区二区| 国产精品美女午夜av| 国产在线一区二区三区四区 | 亚洲黄色高清| 亚洲天堂网在线观看| 欧美一区二区三区在线| 久久阴道视频| 欧美午夜免费| 永久域名在线精品| 一本色道久久精品| 久久精品一二三| 欧美日韩激情网| 狠狠88综合久久久久综合网| 亚洲精品在线观看视频| 性色一区二区三区| 欧美成人日韩| 国产一区二区三区在线观看网站 | 一区二区三区**美女毛片| 久久激五月天综合精品| 欧美日韩精品在线观看| 国模私拍视频一区| 亚洲一区二区高清视频| 麻豆精品精华液| 国产精品国产三级国产普通话99 | 日韩亚洲不卡在线| 久久精视频免费在线久久完整在线看| 欧美高清在线视频观看不卡| 国产欧美精品久久| 亚洲一区二区三区激情| 欧美精品 日韩| **性色生活片久久毛片| 久久国产一区二区三区| 国产精品乱子乱xxxx| 亚洲精品中文字幕有码专区| 久久综合99re88久久爱| 国产欧美日韩免费| 一区二区三区精品视频在线观看| 女主播福利一区| 国内精品一区二区| 欧美在线视频日韩| 国产精品日韩| 亚洲一区亚洲| 国产精品高清网站| 亚洲综合国产精品| 国产精品久久久久毛片大屁完整版| 亚洲免费成人| 欧美日本一区二区高清播放视频| 亚洲国产精品成人久久综合一区| 久久久综合精品| 激情一区二区三区| 久久久久欧美精品| 激情综合在线| 欧美大片一区二区| 亚洲精一区二区三区| 欧美日韩成人| 亚洲天堂免费在线观看视频| 国产精品爱啪在线线免费观看| 亚洲午夜精品网| 国产精品爽爽ⅴa在线观看| 亚洲视频高清| 国产欧美日韩精品在线| 久久精品国产免费| 在线电影国产精品| 欧美mv日韩mv国产网站| 亚洲精品欧美日韩| 欧美日韩国产区一| 在线亚洲激情| 国产精品亚洲综合久久| 久久精品中文| 亚洲另类在线视频| 国产精品户外野外| 欧美在线观看网址综合| 伊人蜜桃色噜噜激情综合| 欧美大片一区| 亚洲无限乱码一二三四麻| 国产精品一级久久久| 久久免费视频这里只有精品| 亚洲国产另类精品专区| 欧美午夜影院| 久久午夜电影| 亚洲图片欧美日产| 精品动漫3d一区二区三区免费| 欧美激情视频在线免费观看 欧美视频免费一 | 免费亚洲一区二区| 正在播放亚洲一区| 国产色视频一区| 免费的成人av| 亚洲欧美另类在线观看| 亚洲成人在线| 国产精品综合av一区二区国产馆| 美女视频黄 久久| 亚洲欧美日韩国产综合在线 | 亚洲黄色一区二区三区| 欧美体内she精视频| 久久人人97超碰国产公开结果 | 免费日韩成人| 午夜国产不卡在线观看视频| 亚洲福利一区| 国产精自产拍久久久久久蜜| 欧美www视频| 香蕉av777xxx色综合一区| 亚洲人成在线观看一区二区| 国产精品午夜视频| 欧美另类一区| 美女性感视频久久久| 午夜欧美精品| 日韩五码在线| 亚洲国产精品成人综合色在线婷婷| 国产精品九九久久久久久久| 欧美二区视频| 久久一综合视频| 欧美一区二区视频网站| 亚洲私人影院| 99国内精品久久| 91久久黄色| 黄网动漫久久久| 国产综合视频| 国产亚洲综合精品| 国产精品久久久久一区二区三区| 欧美久久久久久| 欧美日韩ab| 欧美精品在线极品|