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

Java中volatile防止指令重排

 更新時(shí)間:2021年08月03日 11:24:52   作者:夏季的野獸  
volatile可以防止指令重排,在多線程環(huán)境下有時(shí)候我們需要使用volatile來防止指令重排,來保證代碼運(yùn)行后數(shù)據(jù)的準(zhǔn)確性,感興趣的小伙伴們可以參考一下

volatile可以防止指令重排,在多線程環(huán)境下有時(shí)候我們需要使用volatile來防止指令重排,來保證代碼運(yùn)行后數(shù)據(jù)的準(zhǔn)確性

什么是指令重排?

計(jì)算機(jī)在執(zhí)行程序時(shí),為了提高性能,編譯器和處理器一般會(huì)進(jìn)行指令重排,一般分為以下三種:

指令重排有以下三個(gè)特點(diǎn):

1.單線程環(huán)境下指令重排后可以保證與順序執(zhí)行指令的結(jié)果一致(就是不進(jìn)行指令重排的情況)

//原來的執(zhí)行順序
a=1;
b=0;
//進(jìn)行指令重排后執(zhí)行
b=0;
a=1;

這兩個(gè)順序執(zhí)行的指令結(jié)果都是a=1,b=0

2.進(jìn)行指令重排的時(shí)候要考慮指令之間的數(shù)據(jù)依賴性(某個(gè)指令的數(shù)據(jù)需要根據(jù)另一個(gè)指令的數(shù)據(jù)獲得)

//原來的執(zhí)行順序
a=0;    //指令1
a=10;    //指令2
b=a+1;   //指令3

//進(jìn)行指令重排后
a=0;        
b=a+1;    
a=10;      

此時(shí)兩種順序輸出的結(jié)果就不一樣了,這是因?yàn)橹噶?的數(shù)據(jù)依賴于指令2,單線程環(huán)境下指令重排不會(huì)出現(xiàn)這種情況。

3.多線程環(huán)境下,多個(gè)線程交替執(zhí)行,由于編譯器會(huì)進(jìn)行指令重排,結(jié)果無法預(yù)測。

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

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

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

代碼的執(zhí)行過程一定是是int a=10然后int b=20,但是代碼轉(zhuǎn)換成計(jì)算機(jī)可以識(shí)別的指令可能是指令2,指令1。

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

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

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

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

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

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

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

  • 保證某些特定操作的執(zhí)行順序
  • 保證某些變量的內(nèi)存可見性(實(shí)現(xiàn)了volatile保證可見性)

編譯器和處理器都可以進(jìn)行指令重排,那么如果我們?cè)诔绦蛑胁迦胍粭lMemery Barrier(內(nèi)存屏障),那么就會(huì)告訴編譯器和cpu不能對(duì)這條指令進(jìn)行重排,也就是說通過插入內(nèi)存屏障,使屏障前后的指令不會(huì)進(jìn)行重排優(yōu)化,內(nèi)存屏障還可以強(qiáng)制刷出cpu的緩存,因此cpu上的線程都能讀到這些數(shù)據(jù)的最新版本。

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

內(nèi)存屏障分為四種:

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

  • Load相當(dāng)于讀屏障
  • Store相當(dāng)于寫屏障

到此這篇關(guān)于Java中volatile防止指令重排 的文章就介紹到這了,更多相關(guān)Java volatile防止指令重排 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Boot中KafkaListener的介紹、原理和使用方法案例詳解

    Spring?Boot中KafkaListener的介紹、原理和使用方法案例詳解

    本文介紹了Spring Boot中 @KafkaListener 注解的介紹、原理和使用方法,通過本文的介紹,我們希望讀者能夠更好地理解Spring Boot中 @KafkaListener 注解的使用方法,并在項(xiàng)目中更加靈活地應(yīng)用
    2023-09-09
  • 一文帶你揭秘SpringMvc參數(shù)值映射

    一文帶你揭秘SpringMvc參數(shù)值映射

    這篇文章主要給大家介紹了關(guān)于SpringMvc參數(shù)值映射的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 在netty中使用native傳輸協(xié)議的方法

    在netty中使用native傳輸協(xié)議的方法

    這篇文章主要介紹了在netty中使用native傳輸協(xié)議,這里我們只以Kqueue為例介紹了netty中native傳輸協(xié)議的使用,需要的朋友可以參考下
    2022-05-05
  • SpringBoot使用Interceptor攔截器的實(shí)例

    SpringBoot使用Interceptor攔截器的實(shí)例

    這篇文章主要介紹了SpringBoot使用Interceptor攔截器的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • logback 實(shí)現(xiàn)給變量指定默認(rèn)值

    logback 實(shí)現(xiàn)給變量指定默認(rèn)值

    這篇文章主要介紹了logback 實(shí)現(xiàn)給變量指定默認(rèn)值操作,具有很好的參考家價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Mybatis映射文件根標(biāo)簽與子標(biāo)簽示例講解

    Mybatis映射文件根標(biāo)簽與子標(biāo)簽示例講解

    這篇文章主要介紹了Mybatis映射文件根標(biāo)簽與子標(biāo)簽,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Java集合中的LinkedHashMap使用解析

    Java集合中的LinkedHashMap使用解析

    這篇文章主要介紹了Java集合中的LinkedHashMap使用解析,LinkedHashMap是繼承于HashMap的,所以它的很多屬性和方法都是HashMap中的,那么它是怎么實(shí)現(xiàn)有序存儲(chǔ)的呢,需要的朋友可以參考下
    2023-12-12
  • Java獲取兩個(gè)集合List的交集、補(bǔ)集、并集(相加)和差集(相減)的幾種方式

    Java獲取兩個(gè)集合List的交集、補(bǔ)集、并集(相加)和差集(相減)的幾種方式

    這篇文章主要介紹了Java獲取兩個(gè)集合List的交集、補(bǔ)集、并集(相加)和差集(相減)的幾種方式,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2025-04-04
  • 關(guān)于Java中的klass和class

    關(guān)于Java中的klass和class

    這篇文章主要介紹了關(guān)于Java中klass和class的區(qū)別,vm加載的字節(jié)碼,也就是.class文件,被加載到方法區(qū)里面,叫Kclass,是一個(gè)C++對(duì)象,含有類的信息、虛方法表等,需要的朋友可以參考下
    2023-08-08
  • Spring超詳細(xì)講解注解開發(fā)

    Spring超詳細(xì)講解注解開發(fā)

    Spring是輕代碼而重配置的框架,配置比較繁重,影響開發(fā)效率,所以注解開發(fā)是一種趨勢(shì)。本文將通過示例為大家詳細(xì)講講Spring如何實(shí)現(xiàn)注解開發(fā),感興趣的可以學(xué)習(xí)一下
    2022-08-08

最新評(píng)論

台南县| 达尔| 安化县| 大同县| 海原县| 临夏县| 武定县| 南投县| 建始县| 原阳县| 南漳县| 台安县| 香格里拉县| 乳山市| 榆中县| 库车县| 辉县市| 额尔古纳市| 沈丘县| 嘉祥县| 寻甸| 新密市| 玛纳斯县| 互助| 霞浦县| 德令哈市| 上虞市| 蒙阴县| 桃江县| 中江县| 西畴县| 苏尼特左旗| 岳西县| 婺源县| 景洪市| 吴旗县| 营口市| 青田县| 云龙县| 仪陇县| 双峰县|