麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 開(kāi)發(fā) > Java > 正文

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

2024-07-14 08:43:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

Java,關(guān)鍵字,volatile

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

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

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

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

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

線程1的兩條語(yǔ)句之間沒(méi)有依賴性,經(jīng)過(guò)指令重排后,有可能inited置為true以后,context還沒(méi)有初始化。線程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ì)VeVb武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美精品1区 | 国产精品久久久久无码av | 国产免费视频一区二区裸体 | 亚洲精品动漫在线观看 | 圆产精品久久久久久久久久久 | 亚洲天堂ww| 日本爽快片100色毛片视频 | 国产69精品久久久久9999不卡免费 | 色综合欧美 | 激情夜色 | 色人阁在线视频 | 九九热在线精品视频 | 99国产精品白浆在线观看免费 | 禁漫天堂久久久久久久久久 | 怦然心动50免费完整版 | 曰韩黄色片| 看一级毛片 | 国产91久久久久久 | 久久久无码精品亚洲日韩按摩 | 亚洲小视频在线播放 | 免费观看一区二区三区视频 | 国产乱乱视频 | 国产精品99免费视频 | 日本在线精品视频 | 欧美一a一片一级一片 | 日本免费一区二区三区四区 | 色综合久久久久久久粉嫩 | 一级毛片免费观看在线 | aaaaa国产欧美一区二区 | 亚洲一区动漫 | www.成人精品 | 欧美18—19sex性hd按摩 | 色中射| 久久久久久久久久网 | 国产成人午夜高潮毛片 | 日本教室三级在线看 | 国产免费最爽的乱淫视频a 毛片国产 | 国产亚洲精品久久 | 欧美日韩免费在线观看视频 | 亚洲国产超高清a毛毛片 | 国产欧美亚洲精品 |