欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

對(duì)于如下代碼:

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線(xiàn)程
  public static void main(String[] args) throws InterruptedException {
    new Thread(new VolatileTest(), "支線(xiàn)程Volatile").start();
    Thread.sleep(1000);
    flag = true;
  }

}

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

private volatile int i;

i++;

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

禁止指令重排

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

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

上面3條指令進(jìn)過(guò)JVM優(yōu)化以后,時(shí)間的執(zhí)行順序不一定是從上到下,有可能是 第二條--->第一條-->第三條。總之不會(huì)影響最終執(zhí)行結(jié)果。

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

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

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

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

相關(guān)文章

  • SpringBoot中的HATEOAS詳情

    SpringBoot中的HATEOAS詳情

    這篇文章主要介紹了SpringBoot中的HATEOAS詳情,SpringBoot提供了HATEOAS的便捷使用方式,文章圍繞主題展開(kāi)詳細(xì)介紹內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • Java并發(fā)編程必備之Future機(jī)制

    Java并發(fā)編程必備之Future機(jī)制

    今天給大家?guī)?lái)的是關(guān)于Java并發(fā)編程的相關(guān)知識(shí),文章圍繞著Java Future機(jī)制展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java中對(duì)象的深復(fù)制(深克?。┖蜏\復(fù)制(淺克隆)介紹

    Java中對(duì)象的深復(fù)制(深克?。┖蜏\復(fù)制(淺克?。┙榻B

    這篇文章主要介紹了Java中對(duì)象的深復(fù)制(深克?。┖蜏\復(fù)制(淺克?。?,需要的朋友可以參考下
    2015-03-03
  • 在Eclipse中更改maven項(xiàng)目名的方法

    在Eclipse中更改maven項(xiàng)目名的方法

    今天小編就為大家分享一篇關(guān)于在Eclipse中更改maven項(xiàng)目名的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • java切分字符串的2種方法實(shí)例

    java切分字符串的2種方法實(shí)例

    在我們?nèi)粘9ぷ髦薪?jīng)常遇到截取字符串的需求,下面這篇文章主要給大家介紹了關(guān)于java切分字符串的2種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • mybatis+springboot發(fā)布postgresql數(shù)據(jù)的實(shí)現(xiàn)

    mybatis+springboot發(fā)布postgresql數(shù)據(jù)的實(shí)現(xiàn)

    本文主要介紹了mybatis+springboot發(fā)布postgresql數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Spring Data JPA使用JPQL與原生SQL進(jìn)行查詢(xún)的操作

    Spring Data JPA使用JPQL與原生SQL進(jìn)行查詢(xún)的操作

    這篇文章主要介紹了Spring Data JPA使用JPQL與原生SQL進(jìn)行查詢(xún)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring Cloud 專(zhuān)題之Sleuth 服務(wù)跟蹤實(shí)現(xiàn)方法

    Spring Cloud 專(zhuān)題之Sleuth 服務(wù)跟蹤實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring Cloud 專(zhuān)題之Sleuth 服務(wù)跟蹤,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java設(shè)計(jì)模式之享元模式示例詳解

    Java設(shè)計(jì)模式之享元模式示例詳解

    享元模式(FlyWeight?Pattern),也叫蠅量模式,運(yùn)用共享技術(shù),有效的支持大量細(xì)粒度的對(duì)象,享元模式就是池技術(shù)的重要實(shí)現(xiàn)方式。本文將通過(guò)示例詳細(xì)講解享元模式,感興趣的可以了解一下
    2022-03-03
  • multi-catch和try-catch異常處理知識(shí)點(diǎn)詳解

    multi-catch和try-catch異常處理知識(shí)點(diǎn)詳解

    在本篇文章里我們給大家分享了一篇關(guān)于multi-catch和try-catch異常處理知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2019-11-11

最新評(píng)論