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

Java volatile如何實現(xiàn)禁止指令重排

 更新時間:2020年11月04日 11:16:51   作者:柒  
這篇文章主要介紹了Java volatile如何實現(xiàn)禁止指令重排,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

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

源代碼 -> 編譯器優(yōu)化的重排 -> 指令并行的重排 -> 內(nèi)存系統(tǒng)的重排 -> 最終執(zhí)行指令

單線程環(huán)境里面確保最終執(zhí)行結(jié)果和代碼順序的結(jié)果一致

處理器在進行重排序時,必須要考慮指令之間的數(shù)據(jù)依賴性

多線程環(huán)境中線程交替執(zhí)行,由于編譯器優(yōu)化重排的存在,兩個線程中使用的變量能否保證一致性是無法確定的,結(jié)果無法預(yù)測。

指令重排 - example 1

public void mySort() {
	int x = 11;
	int y = 12;
	x = x + 5;
	y = x * x;
}

按照正常單線程環(huán)境,執(zhí)行順序是 1 2 3 4

但是在多線程環(huán)境下,可能出現(xiàn)以下的順序:

2 1 3 4

1 3 2 4

上述的過程就可以當做是指令的重排,即內(nèi)部執(zhí)行順序,和我們的代碼順序不一樣

但是指令重排也是有限制的,即不會出現(xiàn)下面的順序

4 3 2 1

因為處理器在進行重排時候,必須考慮到指令之間的數(shù)據(jù)依賴性

因為步驟 4:需要依賴于 y的申明,以及x的申明,故因為存在數(shù)據(jù)依賴,無法首先執(zhí)行

例子

int a,b,x,y = 0

線程1 線程2
x = a; y = b;
b = 1; a = 2;
x = 0; y = 0

因為上面的代碼,不存在數(shù)據(jù)的依賴性,因此編譯器可能對數(shù)據(jù)進行重排

線程1 線程2
b = 1; a = 2;
x = a; y = b;
x = 2; y = 1

這樣造成的結(jié)果,和最開始的就不一致了,這就是導致重排后,結(jié)果和最開始的不一樣,因此為了防止這種結(jié)果出現(xiàn),volatile就規(guī)定禁止指令重排,為了保證數(shù)據(jù)的一致性

指令重排 - example 2

比如下面這段代碼

public class ResortSeqDemo {
  int a= 0;
  boolean flag = false;

  public void method01() {
    a = 1;
    flag = true;
  }

  public void method02() {
    if(flag) {
      a = a + 5;
      System.out.println("reValue:" + a);
    }
  }
}

我們按照正常的順序,分別調(diào)用method01() 和 method02() 那么,最終輸出就是 a = 6

但是如果在多線程環(huán)境下,因為方法1 和 方法2,他們之間不能存在數(shù)據(jù)依賴的問題,因此原先的順序可能是

a = 1;
flag = true;

a = a + 5;
System.out.println("reValue:" + a);

但是在經(jīng)過編譯器,指令,或者內(nèi)存的重排后,可能會出現(xiàn)這樣的情況

flag = true;

a = a + 5;
System.out.println("reValue:" + a);

a = 1;

也就是先執(zhí)行 flag = true后,另外一個線程馬上調(diào)用方法2,滿足 flag的判斷,最終讓a + 5,結(jié)果為5,這樣同樣出現(xiàn)了數(shù)據(jù)不一致的問題

為什么會出現(xiàn)這個結(jié)果:多線程環(huán)境中線程交替執(zhí)行,由于編譯器優(yōu)化重排的存在,兩個線程中使用的變量能否保證一致性是無法確定的,結(jié)果無法預(yù)測。

這樣就需要通過volatile來修飾,來保證線程安全性

Volatile針對指令重排做了啥

Volatile實現(xiàn)禁止指令重排優(yōu)化,從而避免了多線程環(huán)境下程序出現(xiàn)亂序執(zhí)行的現(xiàn)象

首先了解一個概念,內(nèi)存屏障(Memory Barrier)又稱內(nèi)存柵欄,是一個CPU指令,它的作用有兩個:

保證特定操作的順序保證某些變量的內(nèi)存可見性(利用該特性實現(xiàn)volatile的內(nèi)存可見性)

由于編譯器和處理器都能執(zhí)行指令重排的優(yōu)化,如果在指令鍵插入一條Memory Barrier則會告訴編譯器和CPU,不管什么指令都不能和這條Memory Barrier指令重排序,也就是說,通過插入內(nèi)存屏障前后的指令執(zhí)行重排序優(yōu)化。內(nèi)存屏障另外一個作用是刷新出各種CPU的緩存數(shù),因此任何cpu上的線程都能讀取到這些數(shù)據(jù)的最新版本


也就是在Volatile的寫和讀的時候,加入屏障,防止出現(xiàn)指令重排線程安全得到保證

工作內(nèi)存與主內(nèi)存同步延遲現(xiàn)象導致的可見性問題

  • 可以使用synchronized或volatile關(guān)鍵字解決,它們都可以使得一個線程修改后的變量立即對其他線程可見。
  • 對于指令重排導致的可見性問題和有序性問題
  • 可以利用volatile關(guān)鍵字解決,因為volatile的另一個作用就是禁止重排序優(yōu)化。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot如何通過路徑映射獲取本機圖片資源

    Springboot如何通過路徑映射獲取本機圖片資源

    項目中對圖片的處理與查看是必不可少的,本文將講解如何通過項目路徑來獲取到本機電腦的圖片資源,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-08-08
  • Jrebel啟動失敗解決方案詳解

    Jrebel啟動失敗解決方案詳解

    這篇文章主要介紹了Jrebel啟動失敗解決方案詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot okhtt工具類封裝方式

    SpringBoot okhtt工具類封裝方式

    本文介紹了如何在SpringBoot項目中使用OkHttp工具類進行HTTP請求,并提供了一個封裝了GET和POST方法的工具類示例,在Controller中使用該工具類時,需要注意OkHttpClient的靜態(tài)初始化和異常處理
    2025-03-03
  • Java中static變量能繼承嗎

    Java中static變量能繼承嗎

    這篇文章主要介紹了Java中static變量能繼承,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Mybatis Integer類型參數(shù)值為0時得到為空的解決方法

    Mybatis Integer類型參數(shù)值為0時得到為空的解決方法

    這篇文章主要介紹了Mybatis Integer類型參數(shù)值為0時得到為空的解決方法,有需要的朋友們可以學習下。
    2019-08-08
  • 教你一步解決java.io.FileNotFoundException:找不到文件異常

    教你一步解決java.io.FileNotFoundException:找不到文件異常

    這篇文章主要給大家介紹了關(guān)于如何一步解決java.io.FileNotFoundException:找不到文件異常的相關(guān)資料,文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • java后端訪問https證書的問題及解決

    java后端訪問https證書的問題及解決

    這篇文章主要介紹了java后端訪問https證書的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • SpringBoot實現(xiàn)devtools實現(xiàn)熱部署過程解析

    SpringBoot實現(xiàn)devtools實現(xiàn)熱部署過程解析

    這篇文章主要介紹了SpringBoot實現(xiàn)devtools實現(xiàn)熱部署過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Spring Data JPA+kkpager實現(xiàn)分頁功能實例

    Spring Data JPA+kkpager實現(xiàn)分頁功能實例

    本篇文章主要介紹了Spring Data JPA+kkpager實現(xiàn)分頁功能實例,具有一定的參考價值,有興趣的可以了解一下
    2017-06-06
  • JpaRepository?實現(xiàn)簡單條件查詢

    JpaRepository?實現(xiàn)簡單條件查詢

    這篇文章主要介紹了JpaRepository?實現(xiàn)簡單條件查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論

浙江省| 泗洪县| 遵义市| 印江| 台安县| 聊城市| 西贡区| 怀远县| 镇雄县| 富川| 长乐市| 姜堰市| 友谊县| 肇东市| 建宁县| 宣恩县| 肥城市| 从化市| 正安县| 台前县| 称多县| SHOW| 广河县| 赤峰市| 泾川县| 广宁县| 青川县| 乐安县| 邢台县| 陆川县| 霞浦县| 台中县| 内黄县| 遂平县| 巢湖市| 西宁市| 上饶市| 绥江县| 陈巴尔虎旗| 社旗县| 秀山|