最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)volatile可見性的驗(yàn)證實(shí)現(xiàn)

 更新時(shí)間:2020年05月18日 11:32:34   作者:anlian523  
這篇文章主要介紹了Java并發(fā)volatile可見性的驗(yàn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

普通讀 無法及時(shí)獲得 主內(nèi)存變量

public class volatileTest {
  static boolean flag = false;//非volatile變量

  public static void main(String[] args) throws Exception {
    new Thread(new Runnable() {
      @Override
      public void run() {
        while(!flag){
        };
      }
    }).start();
    Thread.sleep(100);
    flag = true;
    System.out.println("主線程運(yùn)行完畢");
  }
}

主線程已經(jīng)修改了flag為true,但子線程一直不會(huì)退出循環(huán),因?yàn)樽泳€程一直沒有同步到 主內(nèi)存中的變量的值。

截圖可見程序一直沒有退出,使用dump threads后:

"Thread-0" #12 prio=5 os_prio=0 tid=0x0000000022d89800 nid=0x168 runnable [0x00000000248df000]
java.lang.Thread.State: RUNNABLE
at volatileTest$1.run(volatileTest.java:10)
at java.lang.Thread.run(Thread.java:745)

volatile讀 及時(shí)獲得 主內(nèi)存變量

public class volatileTest {
  static volatile boolean flag = false;//volatile變量

  public static void main(String[] args) throws Exception {
    new Thread(new Runnable() {
      @Override
      public void run() {
        while(!flag){
        };
      }
    }).start();
    Thread.sleep(100);
    flag = true;
    System.out.println("主線程運(yùn)行完畢");
  }
}

加了一個(gè)volatile關(guān)鍵字,子線程就能檢測(cè)到flag的變化了。子線程會(huì)退出。

普通讀+sleep

public class volatileTest {
  static boolean flag = false;//非volatile變量

  public static void main(String[] args) throws Exception {
    new Thread(new Runnable() {
      @Override
      public void run() {
        while(!flag){
          try {
            Thread.sleep(1);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        };
      }
    }).start();
    Thread.sleep(100);
    flag = true;
    System.out.println("主線程運(yùn)行完畢");
  }
}

加了sleep,子線程會(huì)退出。

其實(shí)就算變量不是volatile的,JVM也會(huì)盡量去保證可見性。最開始的例子,由于CPU一直執(zhí)行循環(huán),沒有其他時(shí)間來獲取 主內(nèi)存中的變量的最新值,但加了sleep后,CPU就有時(shí)間去獲取 主內(nèi)存中的東西了。

普通讀+同步塊

public class volatileTest {
  static boolean flag = false;//非volatile變量
  static Object sync = new Object();

  public static void main(String[] args) throws Exception {
    new Thread(new Runnable() {
      @Override
      public void run() {
        while(!flag){
          synchronized (sync) {}//隨便synchronized一個(gè)對(duì)象
          //synchronized (this)也可以
        };
      }
    }).start();
    Thread.sleep(100);
    flag = true;
    System.out.println("主線程運(yùn)行完畢");
  }
}

加了同步塊,子線程會(huì)退出。

這是因?yàn)閟ynchronized具體過程是:

  • 獲得同步鎖;
  • 清空工作內(nèi)存;
  • 從主內(nèi)存拷貝對(duì)象副本到工作內(nèi)存;
  • 執(zhí)行代碼(計(jì)算或者輸出等);
  • 刷新主內(nèi)存數(shù)據(jù);
  • 釋放同步鎖。

簡(jiǎn)單的說,synchronized進(jìn)入時(shí),會(huì)將 主內(nèi)存中最新的變量,拷貝進(jìn) 自己線程 的工作內(nèi)存。synchronized退出時(shí),會(huì)把 自己線程的工作內(nèi)存的變量 弄進(jìn) 主內(nèi)存中。

同步塊 遭遇 鎖消除

public class volatileTest {
  static boolean flag = false;//非volatile變量

  public static void main(String[] args) throws Exception {
    new Thread(new Runnable() {
      @Override
      public void run() {
        while(!flag){
          synchronized (new Object()){}
        };
      }
    }).start();
    Thread.sleep(100);
    flag = true;
    System.out.println("主線程運(yùn)行完畢");
  }
}

子線程不會(huì)退出。

原因是:synchronized (new Object()){}中這個(gè)Object永遠(yuǎn)不可能逃逸到同步塊以外去,所以同步操作其實(shí)根本不需要執(zhí)行了,既然沒有執(zhí)行同步,那么相當(dāng)于這里是啥也沒有。

普通讀+System.out.println

public class volatileTest {
  static boolean flag = false;

  public static void main(String[] args) throws Exception {
    new Thread(new Runnable() {
      @Override
      public void run() {
        while(!flag){
          System.out.println("子線程running");
        };
      }
    }).start();
    Thread.sleep(100);
    flag = true;
    System.out.println("主線程運(yùn)行完畢");
  }
}

加了System.out.println,子線程會(huì)退出。

因?yàn)閛ut這個(gè)PrintStream實(shí)例的println實(shí)現(xiàn)是:

  public void println(String x) {
    synchronized (this) {
      print(x);
      newLine();
    }
  }

因?yàn)樗灿型綁K。

到此這篇關(guān)于Java并發(fā)volatile可見性的驗(yàn)證實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java并發(fā)volatile驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡(jiǎn)單易懂講解happens-before原則

    簡(jiǎn)單易懂講解happens-before原則

    Java內(nèi)存模型中的happens-before是什么?為什么會(huì)有這東西的存在?一個(gè)新東西肯定是上手先,但是等我們空下來回過頭來,我們還是需要去理解這些知識(shí),只有這樣我才能深刻的記住,并且運(yùn)用熟練。下來和小編來一起學(xué)習(xí)下
    2019-05-05
  • SpringBoot Event 事件如何實(shí)現(xiàn)異步延遲執(zhí)行

    SpringBoot Event 事件如何實(shí)現(xiàn)異步延遲執(zhí)行

    這篇文章主要介紹了Spring Boot Event 事件如何實(shí)現(xiàn)異步延遲執(zhí)行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java current并發(fā)包超詳細(xì)分析

    Java current并發(fā)包超詳細(xì)分析

    current并發(fā)包、在JDK1.5之前Java并沒有提供線程安全的一些工具類去操作多線程,需要開發(fā)人員自行編寫實(shí)現(xiàn)線程安全,但仍然無法完全避免低性能、死鎖、資源管理等問題。在JDK1.5時(shí)新增了java.util.current并發(fā)包,其中提供了許多供我們使用的并發(fā)編程工具類
    2023-02-02
  • java實(shí)現(xiàn)給出分?jǐn)?shù)數(shù)組得到對(duì)應(yīng)名次數(shù)組的方法

    java實(shí)現(xiàn)給出分?jǐn)?shù)數(shù)組得到對(duì)應(yīng)名次數(shù)組的方法

    這篇文章主要介紹了java實(shí)現(xiàn)給出分?jǐn)?shù)數(shù)組得到對(duì)應(yīng)名次數(shù)組的方法,涉及java針對(duì)數(shù)組的遍歷、排序及運(yùn)算的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • 詳解springmvc攔截器攔截靜態(tài)資源

    詳解springmvc攔截器攔截靜態(tài)資源

    本篇文章主要介紹了詳解springmvc攔截器攔截靜態(tài)資源,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java 中引入內(nèi)部類的意義?

    Java 中引入內(nèi)部類的意義?

    這篇文章主要介紹了Java 中引入內(nèi)部類的意義?文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • idea2017建立jsp工程及tomcat配置教程

    idea2017建立jsp工程及tomcat配置教程

    本文通過圖文并茂的形式給大家介紹了idea2017建立jsp工程及tomcat等配置的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java常見基本數(shù)據(jù)結(jié)構(gòu)概覽

    Java常見基本數(shù)據(jù)結(jié)構(gòu)概覽

    這篇文章主要介紹了Java常見的幾種基本數(shù)據(jù)結(jié)構(gòu),包括其含義和用法,,需要的朋友可以參考下
    2017-09-09
  • java多線程詳細(xì)總結(jié)

    java多線程詳細(xì)總結(jié)

    以下小編就對(duì)java中的多線程進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-10-10
  • java獲取當(dāng)前時(shí)間戳的方法

    java獲取當(dāng)前時(shí)間戳的方法

    本文主要介紹了java獲取當(dāng)前時(shí)間戳的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論

大城县| 孝昌县| 东乌珠穆沁旗| 区。| 凉山| 五大连池市| 永昌县| 永寿县| 潼关县| 临猗县| 临海市| 托克托县| 盐城市| 青阳县| 城市| 庆城县| 桐梓县| 信宜市| 广德县| 苏尼特左旗| 麻城市| 台南县| 谢通门县| 称多县| 八宿县| 石首市| 鹤岗市| 施秉县| 庐江县| 岳普湖县| 沙田区| 阿城市| 郎溪县| 靖西县| 房产| 马尔康县| 临汾市| 长宁县| 赣榆县| 河南省| 丘北县|