成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

java中volatile關(guān)鍵字有什么作用-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)java中volatile關(guān)鍵字有什么作用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

閻良網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

1. volatile關(guān)鍵字的作用:保證了變量的可見性(visibility)。被volatile關(guān)鍵字修飾的變量,如果值發(fā)生了變更,其他線程立馬可見,避免出現(xiàn)臟讀的現(xiàn)象。如以下代碼片段,isShutDown被置為true后,doWork方法仍有執(zhí)行。如用volatile修飾isShutDown變量,可避免此問題。

public class VolatileTest3 { static class Work {  boolean isShutDown = false;  void shutdown() {   isShutDown = true;   System.out.println("shutdown!");  }  void doWork() {   while (!isShutDown) {    System.out.println("doWork");   }  } } public static void main(String[] args) {  Work work = new Work();  new Thread(work::doWork).start();  new Thread(work::doWork).start();  new Thread(work::doWork).start();  new Thread(work::shutdown).start();  new Thread(work::doWork).start();  new Thread(work::doWork).start();  new Thread(work::doWork).start(); }}

出現(xiàn)臟讀時(shí),運(yùn)行結(jié)果如下:

2. 為什么會(huì)出現(xiàn)臟讀?

Java內(nèi)存模型規(guī)定所有的變量都是存在主存當(dāng)中,每個(gè)線程都有自己的工作內(nèi)存。線程對(duì)變量的所有操作都必須在工作內(nèi)存中進(jìn)行,而不能直接對(duì)主存進(jìn)行操作。并且每個(gè)線程不能訪問其他線程的工作內(nèi)存。變量的值何時(shí)從線程的工作內(nèi)存寫回主存,無法確定。

3. happens-before規(guī)則的理解與勘誤

在網(wǎng)上查volatile關(guān)鍵字相關(guān)信息時(shí),多篇博客提到了happens-before原則,個(gè)人對(duì)此原則的理解是:當(dāng)操作該volatile變量時(shí),所有前序?qū)υ撟兞康牟僮鞫家淹瓿桑ㄈ绮淮嬖谝炎兏磳懟刂鞔娴那闆r),所有后續(xù)對(duì)該變量的操作,都未開始。僅此而已。

這里,我認(rèn)為網(wǎng)上很常見的一個(gè)理論對(duì)此理解有誤,如下圖。此觀點(diǎn)認(rèn)為,由于volatile變量flag的happens-before原則,所以A線程2處對(duì)其的寫操作一定先于B線程3處對(duì)其的讀操作。其實(shí)這種觀點(diǎn)是有邏輯缺陷的,如果存在一個(gè)C線程,先讀取flag的值,后寫入flag的值,那C線程的執(zhí)行時(shí)機(jī)是什么呢?如果還有其他D、E線程呢。。。對(duì)于這段代碼的正確理解是,只要3處拿到的flag是true,那么a的值一定是1,而不是0.因?yàn)関olition修飾的變量,處理器不會(huì)對(duì)其進(jìn)行重排序,所以1處對(duì)a的賦值,一定發(fā)生在2處對(duì)flag的賦值之前。如果flag不是volatile變量,那么1處和2處代碼的執(zhí)行順序是無法保證的(處理器的指令重排序),雖然大部分情況1會(huì)先于2執(zhí)行。happens-before原則約束的并不是多線程對(duì)同一變量的讀和寫操作之間的順序,而是保證讀操作時(shí),前序所有對(duì)該變量的寫操作已生效(寫回主存)。

驗(yàn)證如下:

public class VolatileTest { static class A {  int a = 0;  volatile boolean flag = false;  void writer() {   a = 1;     //1   flag = true;    //2   System.out.println("write");  }  void reader() {   if (flag) {    //3    int i = a;   //4    System.out.println("read true");    System.out.println("i is :" + i);   } else {    int i = a;    System.out.println("read false");    System.out.println("i is :" + i);   }  } } public static void main(String[] args) {  A aaa = new A();  new Thread(() -> aaa.reader()).start();  new Thread(() -> aaa.writer()).start(); }}

運(yùn)行結(jié)果如下,在寫操作執(zhí)行之前,讀操作已完成

4. volatile關(guān)鍵字使用場(chǎng)景

注意:volatile只能保證變量的可見性,不能保證對(duì)volatile變量操作的原子性,見如下代碼:

public class VolatileTest2 { static class A {  volatile int a = 0;  void increase() {   a++;  }  int getA(){   return a;  } } public static void main(String[] args) {  A a = new A();  new Thread(() -> {   for (int i = 0;i < 1000;i++) {    a.increase();   }   System.out.println(a.getA());  }).start();  new Thread(() -> {   for (int i = 0;i < 2000;i++) {    a.increase();   }   System.out.println(a.getA());  }).start();  new Thread(() -> {   for (int i = 0;i < 3000;i++) {    a.increase();   }   System.out.println(a.getA());  }).start();  new Thread(() -> {   for (int i = 0;i < 4000;i++) {    a.increase();   }   System.out.println(a.getA());  }).start();  new Thread(() -> {   for (int i = 0;i < 5000;i++) {    a.increase();   }   System.out.println(a.getA());  }).start(); }}

看完上述內(nèi)容,你們對(duì)java中volatile關(guān)鍵字有什么作用有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

名稱欄目:java中volatile關(guān)鍵字有什么作用-創(chuàng)新互聯(lián)
本文來源:http://jinyejixie.com/article18/deccgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄標(biāo)簽優(yōu)化、建站公司營(yíng)銷型網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站排名

廣告

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

成都定制網(wǎng)站建設(shè)
高邮市| 云林县| 临江市| 全南县| 屏东市| 巩义市| 沂水县| 怀柔区| 岐山县| 仪陇县| 论坛| 钦州市| 迭部县| 浮山县| 固镇县| 穆棱市| 辽宁省| 兴义市| 涪陵区| 固镇县| 牙克石市| 长治市| 米脂县| 通城县| 宁波市| 田东县| 平遥县| 洪江市| 乌兰察布市| 无为县| 肇东市| 五华县| 景宁| 台山市| 怀柔区| 长子县| 太湖县| 瑞昌市| 绵阳市| 曲水县| 西盟|