一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java中的關鍵字volatile詳解

Java中的關鍵字volatile詳解

2019-06-19 17:31陽光、大地和詩歌 Java教程

這篇文章主要介紹了Java中的關鍵字volatile,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

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

Java中的關鍵字volatile詳解

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

保證內存可見性

對于如下代碼:

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

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

}

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

private volatile int i;

i++;

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

禁止指令重排

現代JVM對代碼的執行順序有一定的優化。例如:

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

上面3條指令進過JVM優化以后,時間的執行順序不一定是從上到下,有可能是 第二條--->第一條-->第三條。總之不會影響最終執行結果。

但是在多線程情況下,如下代碼就會有風險:

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

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

以上所述是小編給大家介紹的Java中的關鍵字volatile詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 1769亚洲资源站365在线 | 春光乍泄在线 | 狠狠色狠狠色综合系列 | 97精品国产高清在线看入口 | 国产精品每日在线观看男人的天堂 | 青青久在线视频免费观看 | 99精彩免费观看 | 亚洲网站在线观看 | 日本不卡一区二区三区在线观看 | 91制片厂制作果冻传媒八夷 | 精品牛牛影视久久精品 | 交换性关系中文字幕6 | 大桥未久一区二区 | 精品久久99麻豆蜜桃666 | 天天干天天操天天爽 | 色综合网天天综合色中文男男 | 97视频免费人人观看人人 | 日韩视频一区二区三区 | 国产99区 | chinses台湾男同志hd | 欧美日韩一区二区三区在线视频 | 国产福利自产拍在线观看 | 我强进了老师身体在线观看 | 欧美日本道免费一区二区三区 | 欧美高清无砖专区欧美精品 | 成人影院在线观看 | 精品综合 | 免费看成年视频网页 | 火影小南被爆羞羞网站进入 | 貂蝉沦为姓奴小说 | 成人在线观看免费视频 | 日韩夫妻性生活 | 日本在线观看免费高清 | 久久精品视频91 | 久久毛片视频 | 免费一区 | 亚洲精品国产AV成人毛片 | 亚洲 欧美 日本 国产 高清 | 岛国片免费看 | 亚洲乱码一二三四区国产 | 亚洲精品一区二区三区中文字幕 |