激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務器之家 - 編程語言 - Java教程 - Java中volatile防止指令重排

Java中volatile防止指令重排

2021-11-04 10:14夏季的野獸 Java教程

volatile可以防止指令重排,在多線程環境下有時候我們需要使用volatile來防止指令重排,來保證代碼運行后數據的準確性,感興趣的小伙伴們可以參考一下

volatile可以防止指令重排,在多線程環境下有時候我們需要使用volatile來防止指令重排,來保證代碼運行后數據的準確性

什么是指令重排?

計算機在執行程序時,為了提高性能,編譯器和處理器一般會進行指令重排,一般分為以下三種:

Java中volatile防止指令重排

指令重排有以下三個特點:

1.單線程環境下指令重排后可以保證與順序執行指令的結果一致(就是不進行指令重排的情況)

?
1
2
3
4
5
6
//原來的執行順序
a=1;
b=0;
//進行指令重排后執行
b=0;
a=1;

這兩個順序執行的指令結果都是a=1,b=0

2.進行指令重排的時候要考慮指令之間的數據依賴性(某個指令的數據需要根據另一個指令的數據獲得)

?
1
2
3
4
5
6
7
8
9
//原來的執行順序
a=0;    //指令1
a=10;    //指令2
b=a+1;   //指令3
 
//進行指令重排后
a=0;       
b=a+1;   
a=10;     

此時兩種順序輸出的結果就不一樣了,這是因為指令3的數據依賴于指令2,單線程環境下指令重排不會出現這種情況。

3.多線程環境下,多個線程交替執行,由于編譯器會進行指令重排,結果無法預測。

為什么指令重排能夠提高性能

串行的代碼確實會按代碼語意正確的執行(就是編寫的代碼的運行邏輯),但是編譯器對于代碼本身的優化卻并不一定會按實際的代碼一步一步的執行,就比如下面這段代碼

?
1
2
3
4
public void process() {
    int a = 10;  #指令1
    int b = 20;  #指令2
}

代碼的執行過程一定是是int a=10然后int b=20,但是代碼轉換成計算機可以識別的指令可能是指令2,指令1。

我們知道指令的執行可以分為這幾步:

  • 取址 IF
  • 譯碼和取寄存器操作數 ID
  • 執行或者有效地址計算 EX (ALU邏輯計算單元)
  • 存儲器訪問 MEM
  • 寫回 WB (寄存器)

一段代碼并不是由單條指令就可以執行完畢的,而是通過流水線技術來執行多條指令。

流水線技術是一種將指令分解為多步,并讓不同指令的各步操作重疊,從而實現幾條指令并行處理,這樣就提高了指令的執行速度

簡單來說就是通過指令重排,可以使用流水線技術實現指令的細分,然后實現幾條指令的并行處理,從而提高速度

volatile是怎么禁止指令重排的?

這就涉及到一個概念內存屏障(內存柵欄),它是一個cpu指令,有兩個作用:

  • 保證某些特定操作的執行順序
  • 保證某些變量的內存可見性(實現了volatile保證可見性)

編譯器和處理器都可以進行指令重排,那么如果我們在程序中插入一條Memery Barrier(內存屏障),那么就會告訴編譯器和cpu不能對這條指令進行重排,也就是說通過插入內存屏障,使屏障前后的指令不會進行重排優化,內存屏障還可以強制刷出cpu的緩存,因此cpu上的線程都能讀到這些數據的最新版本。

簡單來說就是插入內存屏障后告訴cpu和編譯器,這個內存屏障前后的指令你不要給我進行重排序

內存屏障分為四種:

StoreStore屏障、StoreLoad屏障、LoadLoad屏障、LoadStore屏障。

  • Load相當于讀屏障
  • Store相當于寫屏障

到此這篇關于Java中volatile防止指令重排 的文章就介紹到這了,更多相關Java volatile防止指令重排 內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/6991329716120584223

延伸 · 閱讀

精彩推薦
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 久久午夜免费视频 | www.99久久久 | 一区国产在线观看 | 成人午夜影院 | 欧美一级特黄a | www.7777在线 | 欧美性受ⅹ╳╳╳黑人a性爽 | 成人午夜免费国产 | 性高湖久久久久久久久aaaaa | 久久久成人一区二区免费影院 | 中文字幕在线观看免费视频 | 在线观看欧美成人 | 成人在线视频免费观看 | 一级做受毛片免费大片 | 欧美大穴 | 97干在线| 免费看欧美黑人毛片 | 视频一区 中文字幕 | 黄色片网站免费在线观看 | 国产精品呻吟 | 欧美精品电影一区二区 | 美女视频大全网站免费 | 国产精品久久久久久影院8一贰佰 | 美女视频免费一区二区 | 男女牲高爱潮免费视频男女 | a网在线| 久久九九热re6这里有精品 | 中国av中文字幕 | 久久密| 国产免费成人 | 日韩激情一区 | 日本大片在线播放 | 午夜av男人的天堂 | 一级毛片特黄 | 奶子吧naiziba.cc免费午夜片在线观看 | 成人一级黄色大片 | 91亚洲精品一区二区福利 | 久久久久亚洲国产精品 | 中文字幕涩涩久久乱小说 | 免费在线观看毛片 | 亚洲第五色综合网 |