重排序與volatile

2021-09-26 02:21:21 字數 794 閱讀 1396

為了提高編譯器和處理器的能力,對**編譯執行順序進行修改

// a和b沒有依賴關係,編譯時可能會是b先執行在執行a

int a = 1

int b = 2

// 下面由於b依賴於a,所以不會進行重排序

int a = 1

int b = a + 1

當乙個執行緒對共享變數進行修改,其他執行緒可以立即知道新的共享變數的值,防止重排序

每次使用時立即從主記憶體重新整理

read,load,use必須連續出現

assign,store,write必須連續出現

minstance沒有被volatile修飾是不正確的

當執行緒a呼叫getinstance方法時,走到第4步,有可能會發生重排序

第4步的執行可分為

1. 分配一塊記憶體

2. 初始化

3. minstance指向這塊記憶體

發生重排序上面順序有可能1,3,2

如果此時執行緒b也來呼叫getinstance方法,在minstance== null時正好執行緒a走到了「minstance指向這塊記憶體」,此時minstance不為null,但還沒有初始化。執行緒b拿到的就是有問題的引用

public class singleton

public static singleton getinstance() }}

return minstance; // 第5步

}}

Volatile禁止指令重排序(三)

計算機在執行程式時,為了提高效能,編譯器和處理器常常會對指令重排,一般分為以下三種 源 編譯器優化的重排 指令並行的重排 記憶體系統的重排 最終執行指令單執行緒環境裡面確保最終執行結果和 順序的結果一致 處理器在進行重排序時,必須要考慮指令之間的資料依賴性 多執行緒環境中線程交替執行,由於編譯器優化...

Volatile禁止指令重排

你寫的程式,計算機並不是按照你寫的那樣去執行的。源 編譯器優化的重排 指令並行可能會重排 記憶體系統可能會重排 執行 處理器在進行指令重排的時候,考慮,資料之間的依賴性!指令重排 不會造成影響的例子 int x 1 1int y 2 2x x 5 3y x x 4我們所期望的 1234 執行的時候可...

volatile的指令重排細節

volatile禁止重排優化 volatile關鍵字另乙個作用就是禁止指令重排優化,從而避免多執行緒環境下程式出現亂序執行的現象,關於指令重排優化前面已詳細分析過,這裡主要簡單說明一下volatile是如何實現禁止指令重排優化的。先了解乙個概念,記憶體屏障 memory barrier 記憶體屏障,...