為了提高編譯器和處理器的能力,對**編譯執行順序進行修改
// 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 記憶體屏障,...