日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java多線程volatile原理及用法解析

瀏覽:101日期:2022-08-28 10:36:39

首先volatile有兩大功能:

保證線程可見性

禁止指令重排序

1、保證線程可見性

首先我們來看這樣一個程序,其中不加volatile關鍵字運行的結果截然不同,加上volatile程序能夠正常結束,不加則程序進入死循環;

package com.designmodal.design.juc01;import java.util.concurrent.TimeUnit;/** * @author D-L * @Classname T001_volatile * @Version 1.0 * @Description volatile 保證線程的可見性 * @Date 2020/7/19 17:30 */public class T001_volatile { //定義一個變量running volatile boolean running = true; public void m(){ while(running){ //TODO 不做任何的處理 System.out.println('while is running When can I stop -------------'); } System.out.println('method is end ---------------'); } public static void main(String[] args) { T001_volatile t001_volatile = new T001_volatile(); new Thread(t001_volatile::m , 'Thread t1').start(); //停一秒 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } //修改running的值 t001_volatile.running = false; }}

通過上面的小程序說明volatile是具有保證線程之間的可見性的功能的,具體是如何實現的呢?下面給大家解釋一下:

之前在上一篇講synchronized時提到了 堆內存是線程共享的,而線程在工作時有自己的工作內存,對于共享變量running來說,線程1和線程2在運行的時候先把running變量copy到自己工作內存,對這個變量的改變都是在自己的工作內存中,并不會直接的反映到其他線程,如果加了volatile,running變量改變其他線程很快就會知道,這就是線程的可見性;

Java多線程volatile原理及用法解析

這里用到的是:MESI(CPU緩存一致性協議) MESI的主要思想:當CPU寫數據時,如果該變量是共享數據,給其他CPU發送信號,使得其他的CPU中的該變量的緩存行無效;歸根結底這里需要借助硬件來幫助我們。

Java多線程volatile原理及用法解析

volatile保證線程可見性但是不能代替synchronized:

package com.designmodal.design.juc01;import java.util.ArrayList;import java.util.List;/** * @author D-L * @Classname VolatileAndSynchronized * @Version 1.0 * @Description synchronized can not be replaced by volatile *volatile 不能代替synchronized *只能保證可見性 不能保證原子性 *count++ 不是原子性操作 * @Date 2020/xx/xx 23:25 */public class VolatileAndSynchronized { volatile int count = 0; public synchronized void m(){ for (int i = 0; i < 1000; i++) { //非原子性操作 匯編指令至少有三條 count++; } } public static void main(String[] args) { VolatileAndSynchronized v = new VolatileAndSynchronized(); List<Thread> threads = new ArrayList<>(); for (int i = 0; i < 10; i++) { threads.add(new Thread(v::m , 'Thread'+ i)); } threads.forEach(o ->o.start()); threads.forEach(o ->{ try {o.join(); } catch (InterruptedException e) {e.printStackTrace(); } }); System.out.println(v.count); }}

2、禁止指令重排序

指令重排序也是和CPU有關系,加了volatile之后,每次寫都會背線程看到。CPU原來執行指令時,是按照一步一步順序來執行的,但是CPU為了提高效率它會把指令并發來執行,第一個指令執行到一半的時候第二條指令就可能已經開始執行了,這叫流水線式的執行;為了充分的利用CPU,就要求編譯器把編譯完的源碼指令,可能會進行一個指令重新排序;這種架構通過實際驗證,很大效率上提高了CPU的使用效率。

下面從一個面試題來討論一下指令重排序:

面試官:你聽過單例模式嗎?

你:當然聽過,不然沒法聊了。

package com.designmodal.design.juc01;import java.util.concurrent.TimeUnit;/** * @author D-L * @Classname T002_volatile * @Version 1.0 * @Description volatile 指令重排序 * @Date 2020/7/20 00:48 */public class T002_volatile { //創建私有的 T002_volatile 有人會問這里的volatile要不要使用,這里的答案是肯定的 private static /**volatile*/ volatile T002_volatile INSTANCE; public T002_volatile() {} public T002_volatile getInstance(){ //模擬業務代碼 這里為了synchronized更加細粒度,所以使用了雙重檢查 if(INSTANCE == null){ synchronized (this){ //雙重檢查 if(INSTANCE == null){ //避免線程之間的干擾 在這里睡一秒 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } //創建實例對象 INSTANCE = new T002_volatile(); } } } return INSTANCE; } /** * 創建100個線程 調用getInstance() 打印hashcode值 * @param args */ public static void main(String[] args) { T002_volatile t001_volatile = new T002_volatile(); for (int i = 0; i < 100; i++) { new Thread(() ->{T002_volatile instance = t001_volatile.getInstance();System.out.println(instance.hashCode()); }).start(); } }}

在上述的代碼中:INSTANCE = new T002_volatile(); 經過編譯后的指令是分三步的

1、給指令申請內存

2、給成員變量初始化

3、把這塊對象的內容賦給INSTANCE

在第二步這里既然已經有默認值了,第二個線程來檢查,發現已經有值了根本就不會進入鎖住的那份代碼;加了volatile就不會出現指令重排序了,所以在這個時候一定要保證初始化完成之后才會賦值給這個變量,這就是volatile存在的意義。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷丁香综合| 国产精品91一区二区三区| 免费国产自线拍一欧美视频| 老牛影视精品| 日韩一区二区三区免费播放| 国产99亚洲| 蜜臀久久99精品久久久久久9| 亚洲精品在线二区| 国产精选久久| 久久电影tv| 国产综合精品| 日本欧美在线看| 久久国产乱子精品免费女| 麻豆精品久久| 久久精品中文| 免费在线观看成人| 日本不卡视频在线| 欧美日韩 国产精品| 美女视频黄免费的久久| 久久九九精品| 综合国产在线| 成人在线黄色| 免费在线视频一区| 精品福利久久久| 国产视频亚洲| 精品一区二区三区亚洲| 999国产精品永久免费视频app| 蜜臀av国产精品久久久久| 欧美激情91| 好吊一区二区三区| 国产欧美三级| 欧美午夜不卡影院在线观看完整版免费| 97久久亚洲| 999精品在线| 国产欧美二区| 日韩视频中文| 色综合狠狠操| 中文字幕一区二区三区日韩精品| 国产一区二区视频在线看| 一区二区亚洲视频| 中文字幕色婷婷在线视频| 视频一区二区三区入口| 你懂的亚洲视频| 日韩在线卡一卡二| 另类中文字幕国产精品| 日韩精品成人| 亚洲大全视频| 精品国产午夜| 蜜桃久久av一区| 亚洲欧洲美洲av| 国产日韩在线观看视频| 国产精品嫩草99av在线| 日韩激情一区| 捆绑调教美女网站视频一区| 久久亚洲国产精品一区二区| 亚洲精品成人图区| 国产精品网站在线看| 乱人伦精品视频在线观看| 日韩在线二区| 久久精品国产99国产精品| 亚洲图片久久| 欧美日韩国产探花| 神马午夜久久| 成人在线超碰| 国产精品久久久久久av公交车 | 久久久久久免费视频| 国产精品高潮呻吟久久久久| 在线看片日韩| 亚洲高清毛片| 黄在线观看免费网站ktv| 国产精品一区三区在线观看| 中文字幕一区二区三区四区久久 | 成人在线黄色| 国产精品久久国产愉拍| 中文字幕日韩亚洲| 不卡在线一区| 久久精品亚洲人成影院| 人人草在线视频| 91一区二区三区四区| 精品久久91| 日韩88av| 老牛影视精品| 日韩av首页| 欧美日韩中文字幕一区二区三区| 久久亚洲人体| 国产极品一区| 国产精品亚洲欧美一级在线| 欧美日韩亚洲一区在线观看| 亚洲人妖在线| 在线观看视频免费一区二区三区| 亚洲成人免费| 国内精品99| 亚洲欧美日韩高清在线| 亚洲精品97| 蜜乳av另类精品一区二区| 在线综合欧美| 久久大逼视频| 中文字幕一区二区三区四区久久| 美日韩精品视频| 亚洲伊人精品酒店| 麻豆亚洲精品| 四虎成人精品一区二区免费网站 | 亚洲1234区| 欧美日韩一区二区综合| 在线亚洲一区| 日韩精品中文字幕一区二区| 日韩国产在线不卡视频| 国产欧美午夜| 成人一区而且| 欧美日中文字幕| 久久最新视频| 日韩av网站在线免费观看| 日本少妇精品亚洲第一区| 国产精品视频一区二区三区综合 | 国产探花在线精品| 国产在线观看91一区二区三区| 中文在线资源| 亚洲女同一区| 亚洲tv在线| 国产精品久久久久77777丨| 卡一卡二国产精品| 日韩不卡视频在线观看| 日韩精品一二三四| 国产精品igao视频网网址不卡日韩 | 日韩视频网站在线观看| 日韩国产网站| 99riav1国产精品视频| 亚洲精品一区二区在线播放∴| 欧美日本二区| 久草免费在线视频| 性一交一乱一区二区洋洋av| 日本精品久久| 国产精品原创| 欧美专区18| 国产亚洲字幕| 久久久久美女| 羞羞答答国产精品www一本| 国产欧美日韩综合一区在线播放| 日韩大片免费观看| 日韩中文欧美在线| 老司机免费视频一区二区三区| 激情综合激情| 国产情侣久久| 亚洲精品97| 国产经典一区| 老鸭窝毛片一区二区三区| 久久福利在线| 亚洲精品1区| 欧美激情一区| 丝袜脚交一区二区| 超碰99在线| 日韩午夜在线| 久久gogo国模啪啪裸体| 国产高清久久| 国产精品成人**免费视频| 欧美日韩精品免费观看视频完整 | 国产精品v一区二区三区| 亚洲激情二区| 色综合狠狠操| 97精品久久| 欧洲毛片在线视频免费观看| 国产精品夜夜夜| 最新亚洲一区| 国产成人精品一区二区三区视频| 国产在线欧美| 嫩草伊人久久精品少妇av杨幂| 99国产精品久久久久久久| 福利一区和二区| 日韩avvvv在线播放| 五月婷婷六月综合| 另类欧美日韩国产在线| 亚洲免费毛片| 日韩视频在线一区二区三区 | 日本欧美一区| av成人国产| se01亚洲视频| 欧美国产极品| 亚洲人亚洲人色久| 国产日韩专区| 激情欧美丁香| 综合日韩av| 免费看久久久| 欧美亚洲人成在线| 午夜一级久久| 国产韩日影视精品| 日韩av二区| 欧美经典一区| 国产欧美日韩一区二区三区在线| 亚洲网站视频| 久久久男人天堂| 狂野欧美性猛交xxxx| 国产麻豆一区二区三区精品视频| 一区二区三区四区在线观看国产日韩| 女主播福利一区| 99国产精品免费视频观看| 国产99在线| 婷婷激情一区| 亚洲91视频| 99成人在线视频| 欧美亚洲国产精品久久|