av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java中volatile防止指令重排

瀏覽:35日期:2023-02-10 11:24:20
目錄什么是指令重排?為什么指令重排能夠提高性能volatile是怎么禁止指令重排的?

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

什么是指令重排?

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

Java中volatile防止指令重排

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

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

//原來(lái)的執(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ù)獲得)

//原來(lái)的執(zhí)行順序a=0; //指令1a=10; //指令2b=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é)果無(wú)法預(yù)測(cè)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 成人免费视频在线观看 | 黑人巨大精品欧美一区二区一视频 | 91在线免费观看网站 | 国产高清视频在线 | 成人激情视频网 | 国产日韩精品视频 | 超碰97免费 | 99热激情 | 精品亚洲第一 | 日本中文字幕一区 | 欧美日韩在线一区二区三区 | 亚洲人成在线播放 | 在线免费小视频 | 青青草免费在线视频 | 久久精品国产一区二区电影 | 久久国产精品色av免费观看 | 日本色高清 | 一级黄a视频 | 神马久久春色视频 | 九九伦理电影 | 欧美精品中文 | 先锋影音资源网站 | 国产午夜精品一区二区三区嫩草 | 黄色大片视频 | h视频免费观看 | 在线看av的网址 | 成人在线免费视频观看 | 视频在线亚洲 | 97人人澡人人爽91综合色 | 国产一区h | 日韩视频在线一区二区 | 91资源在线 | 中文字幕精品一区 | 日韩欧美一区二区三区在线播放 | 日韩在线观看 | 亚洲午夜在线 | 日本久久视频 | www亚洲免费国内精品 | 国产91九色 | 亚洲一区二区三区高清 | 中文字幕日韩欧美一区二区三区 |