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

Java中的關(guān)鍵字volatile詳解

 更新時間:2019年03月15日 15:25:36   作者:陽光、大地和詩歌  
這篇文章主要介紹了Java中的關(guān)鍵字volatile,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

volatile關(guān)鍵字經(jīng)常用來修飾變量。不過,volatile本身很容易被誤用。本篇就介紹一下volatile的原理和使用方式。

在介紹volatile關(guān)鍵字原理前,我們首先要了解JVM運行時的內(nèi)存分配邏輯。

對于成員變量i,它存儲在堆內(nèi)存中。每個線程在運行時都會有一個自己的線程棧,線程如果要訪問類的成員變量i,會通過引用獲取到堆中變量i實際的值10,然后把這個變量值拷貝到自己的棧內(nèi)存中,作為一個變量副本,之后線程便不再會與堆中的變量有實際聯(lián)系。每個線程都有一個自己的本地副本,相互隔離。線程訪問自己棧內(nèi)存的效率比訪問堆的效率高。線程對變量i值的修改,只會修改自己線程副本中的值,修改結(jié)束后,在線程退出前,會把自己線程副本中的值,刷新到堆中。

保證內(nèi)存可見性

對于如下代碼:

public class VolatileTest implements Runnable{
  //volatile
  private static boolean flag = false;
  

  @Override
  public void run() {
    while (!flag){
      System.out.println(Thread.currentThread().getName() +"執(zhí)行中");
    }
    System.out.println(Thread.currentThread().getName() +"執(zhí)行完畢");
  }
  
  //main線程
  public static void main(String[] args) throws InterruptedException {
    new Thread(new VolatileTest(), "支線程Volatile").start();
    Thread.sleep(1000);
    flag = true;
  }

}

大多數(shù)時候可以正常中斷,但是一旦發(fā)送異常,便會導(dǎo)致線程死循環(huán)。所以需要在flag標志上加一個volatile關(guān)鍵字。對于加了volatile關(guān)鍵字的變量值,線程1修改了這個值的話,會強制將修改值直接寫入堆內(nèi)存中,其他線程各自線程棧中的變量副本無效,只能去堆中取最新的變量值。多個線程之間的內(nèi)存可見得以保證。
值得注意的是,volatile關(guān)鍵字不能保證原子性。

private volatile int i;

i++;

i ++ 這個操作涉及到獲取值,自增和賦值3部分。無法直接完成。上面想要以volatile來實現(xiàn)原子性的寫法是錯誤的。

禁止指令重排

現(xiàn)代JVM對代碼的執(zhí)行順序有一定的優(yōu)化。例如:

int a = 4;
int b = 5;
int c = a + b; 

上面3條指令進過JVM優(yōu)化以后,時間的執(zhí)行順序不一定是從上到下,有可能是 第二條--->第一條-->第三條??傊粫绊懽罱K執(zhí)行結(jié)果。

但是在多線程情況下,如下代碼就會有風(fēng)險:

//線程1:
context = loadContext();  
inited = true;       
 
//線程2:
while(!inited ){
 
}
doSomething(context);

線程1的兩條語句之間沒有依賴性,經(jīng)過指令重排后,有可能inited置為true以后,context還沒有初始化。線程2發(fā)現(xiàn)inited為true,以為初始化完成,結(jié)束循環(huán),用時間還沒有初始化的context去執(zhí)行doSomething()方法。報錯。所以我們可以用volatile關(guān)鍵字修飾inited,保證context初始化。

以上所述是小編給大家介紹的Java中的關(guān)鍵字volatile詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • SpringBoot?+?Redis如何解決重復(fù)提交問題(冪等)

    SpringBoot?+?Redis如何解決重復(fù)提交問題(冪等)

    在開發(fā)中,一個對外暴露的接口可能會面臨瞬間的大量重復(fù)請求,本文就介紹了SpringBoot + Redis如何解決重復(fù)提交問題,具有一定的參考價值,感興趣的可以了解一下
    2021-12-12
  • Java8中利用stream對map集合進行過濾的方法

    Java8中利用stream對map集合進行過濾的方法

    這篇文章主要給大家介紹了關(guān)于Java8中利用stream對map集合進行過濾的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Eclipse代碼格式化設(shè)置簡單介紹

    Eclipse代碼格式化設(shè)置簡單介紹

    這篇文章主要介紹了Eclipse代碼格式化設(shè)置簡單介紹,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • 解決Hmily與Feign沖突報錯 NullPointerException的問題

    解決Hmily與Feign沖突報錯 NullPointerException的問題

    這篇文章主要介紹了解決Hmily與Feign沖突報錯 NullPointerException的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷)

    解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷)

    這篇文章主要介紹了解讀maven項目中Tomcat10與JSTL的問題匯總(Debug親身經(jīng)歷),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java中的5種同步輔助類介紹

    Java中的5種同步輔助類介紹

    你提交了一些任務(wù),但你想等它們都完成了再做另外一些事情;你提交了一些任務(wù),但是不想讓它們立刻執(zhí)行,等你喊123開始的時候,它們才開始執(zhí)行;等等這些場景,線程之間需要相互配合,或者等待某一個條件成熟執(zhí)行。這些場景想你就需要用到同步輔助類
    2014-04-04
  • 詳解Java并發(fā)編程中的優(yōu)先級隊列PriorityBlockingQueue

    詳解Java并發(fā)編程中的優(yōu)先級隊列PriorityBlockingQueue

    PriorityBlockingQueue是Java中實現(xiàn)了堆數(shù)據(jù)結(jié)構(gòu)的線程安全的有界阻塞隊列。本文將會深入解讀PriorityBlockingQueue的源碼實現(xiàn),感興趣的可以了解一下
    2023-05-05
  • java分布式流處理組件Producer入門詳解

    java分布式流處理組件Producer入門詳解

    這篇文章主要為大家介紹了java分布式流處理組件Producer入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • java jackson 將對象轉(zhuǎn)json時,忽略子對象的某個屬性操作

    java jackson 將對象轉(zhuǎn)json時,忽略子對象的某個屬性操作

    這篇文章主要介紹了java jackson 將對象轉(zhuǎn)json時,忽略子對象的某個屬性操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • JDBC PreparedStatement Like參數(shù)報錯解決方案

    JDBC PreparedStatement Like參數(shù)報錯解決方案

    這篇文章主要介紹了JDBC PreparedStatement Like參數(shù)報錯解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10

最新評論

铜鼓县| 华宁县| 格尔木市| 阿克陶县| 乌拉特中旗| 金塔县| 依安县| 绥化市| 白山市| 交口县| 阳城县| 青河县| 连州市| 武陟县| 永吉县| 秭归县| 酉阳| 仁寿县| 汨罗市| 德钦县| 娄烦县| 南漳县| 广南县| 亚东县| 昌图县| 武义县| 贵溪市| 泰顺县| 平顶山市| 大同市| 财经| 双鸭山市| 阳新县| 南安市| 漠河县| 柘荣县| 巨鹿县| 邛崃市| 澄江县| 镇江市| 噶尔县|