欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中volatile防止指令重排

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

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

什么是指令重排?

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

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

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

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

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

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

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

//進行指令重排后
a=0;        
b=a+1;    
a=10;      

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

內存屏障分為四種:

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

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

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

相關文章

  • java ThreadPool線程池的使用,線程池工具類用法說明

    java ThreadPool線程池的使用,線程池工具類用法說明

    這篇文章主要介紹了java ThreadPool線程池的使用,線程池工具類用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java中CAS機制實現(xiàn)方法詳解

    Java中CAS機制實現(xiàn)方法詳解

    傳統(tǒng)的并發(fā)控制手段如synchronized和ReentrantLock雖有效防止資源競爭,卻可能引起性能開銷,相比之下,CAS(CompareAndSwap)提供一種輕量級的樂觀鎖策略,通過硬件級別的原子指令實現(xiàn)無鎖并發(fā),提高性能,需要的朋友可以參考下
    2024-09-09
  • java實現(xiàn)動態(tài)圖片效果

    java實現(xiàn)動態(tài)圖片效果

    這篇文章主要為大家詳細介紹了java實現(xiàn)動態(tài)圖片效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java實戰(zhàn)之多線程模擬站點售票

    Java實戰(zhàn)之多線程模擬站點售票

    今天帶大家來練習Java實戰(zhàn),文中多線程模擬站點售票這個問題作了詳細的介紹,對正在學習java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • java實現(xiàn)日歷功能

    java實現(xiàn)日歷功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)日歷功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解java創(chuàng)建一個女朋友類(對象啥的new一個就是)==建造者模式,一鍵重寫

    詳解java創(chuàng)建一個女朋友類(對象啥的new一個就是)==建造者模式,一鍵重寫

    這篇文章主要介紹了java建造者模式一鍵重寫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Java堆&優(yōu)先級隊列示例講解(下)

    Java堆&優(yōu)先級隊列示例講解(下)

    這篇文章主要通過示例詳細為大家介紹Java中的堆以及優(yōu)先級隊列,文中的示例代碼講解詳細,對我們了解java有一定幫助,需要的可以參考一下
    2022-03-03
  • 詳解Java 中程序內存的分析

    詳解Java 中程序內存的分析

    這篇文章主要介紹了詳解Java 中程序內存的分析的相關資料,需要的朋友可以參考下
    2017-04-04
  • 連續(xù)調用多個外部系統(tǒng)寫接口保證數(shù)據一致性的思路

    連續(xù)調用多個外部系統(tǒng)寫接口保證數(shù)據一致性的思路

    今天小編就為大家分享一篇關于連續(xù)調用多個外部系統(tǒng)寫接口保證數(shù)據一致性的思路,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java中的比較器詳細解析

    Java中的比較器詳細解析

    這篇文章主要介紹了Java中的比較器詳細解析,基本數(shù)據類型的數(shù)據(除boolean類型外)需要比較大小的話,直接使用比較運算符即可,但是引用數(shù)據類型是不能直接使用比較運算符來比較大小的,需要的朋友可以參考下
    2023-11-11

最新評論