volatile,可見性,有序性

2021-09-13 18:40:42 字數 873 閱讀 4307

1.可見性的實現基於volatile的讀取,寫入兩個操作的記憶體語義。

2.有序性的實現基於jmm針對編譯器制定的volatile重排序表

能否重排序

-第二個操作

-第乙個操作

普通讀/寫

volatile讀

volatile寫

普通讀/寫

novolatile讀

nono

novolatile寫

nono

3.最核心的部分還是記憶體屏障的使用,記憶體屏障實現了volatile讀寫的記憶體語義,也實現了重排序表

理解jmm如何實現volatile的兩層記憶體語義的關鍵是==記憶體屏障==。volatile的兩層記憶體語義都是使用記憶體屏障來實現的。

首先,對4中記憶體屏障的介紹: 記憶體屏障用於控制特定條件下的重排序和記憶體可見性問題。

再看看jmm記憶體屏障的插入策略

對比storestore屏障的定義,這裡的volatile寫是那個store2,該屏障保證在volatile寫執行之前,store1的寫入操作對其他處理器可見,那麼可以得出,該屏障不僅保證了store1已經執行完畢(有序性),也保證了可見性。

對比storeload屏障的定義,這裡的volatile寫是那個store1,該屏障也保證了有序性和可見性。其他都是類似的。

4.從cpu的角度,看看可見性如何實現

//假設有個volatile變數instance,對其進行寫操作

instance = new singleton();

在x86處理器下看看其對應的彙編**的一部分:

lock add1 $0*0
lock字首的指令在多核處理器下引發了兩件事:

關於 volatile 可見性,有序性,記憶體屏障

public class demo1 system.out.println test finish public void setflag boolean flag public static void main string args start new thread start 事實上,控制台不...

原子性,可見性,有序性

1.原子性 read,load,assign,use,store write 基本型別的訪問,讀寫 long,double 非原子性協定 monitorenter,monitorexit jvm lock,unlock,synchronized 2.可見性 volatile synchronized...

關於原子性, 可見性,有序性的思考

原子性是指 不會有中間狀態存在,要麼什麼都沒改變,要麼全都改變 對資料操作的原子性 在併發程式設計中,原子性存在的根本原因是,多個執行緒操作共享變數,由於執行緒間切換排程,導致乙個執行緒操作了另乙個執行緒 半成品 的資料,這是導致多執行緒環境下結果不可 的乙個原因.synchronized 的原子性...