Volatile如何保證有序性(禁止指令重排)

2021-10-07 18:27:29 字數 679 閱讀 7852

volatile如何保證有序性(禁止指令重排)

1.首先我們要了解計算機在執行程式時,為了提高效能,編譯器和處理器一般都會對指令做重排,一般分為以下三種:

單執行緒環境裡面確保程式最終執行的結果和**順序執行的結果一致。

處理器在進行指令重排時必須要考慮指令之間的資料依賴性。

多執行緒環境中線程交替執行,由於編譯器優化重排的存在,兩個或多個執行緒中使用的變數能否保證一致是不能確定的,最後執行的結果也是無法**的。

2.volatile實現禁止指令重排優化,從而避免在多執行緒環境下程式出現亂排序執行的現象。

(1).首先要了解乙個概念,就是記憶體屏障,也稱為記憶體柵欄,他是乙個cpu的指令。作用有兩個:

一是保證特定操作的執行順序;

二是保證某些變數的記憶體可見性(volatile的記憶體可見性是利用該特性實現的)

3.由於編譯器和處理器都能執行指令重排優化,如果在指令之間插入一條記憶體屏障則會告訴編譯器和cup不管在任何情況下,無論任何指令都不能和這條記憶體屏障進行指令重排,也就是說通過插入記憶體屏障禁止在記憶體屏障前後的指令執行重排序優化。記憶體屏障的另外乙個作用就是強制刷出各種cpu的快取資料,因此在任何cpu上的執行緒都能讀取到這些資料的最新值。

volatile,可見性,有序性

1.可見性的實現基於volatile的讀取,寫入兩個操作的記憶體語義。2.有序性的實現基於jmm針對編譯器制定的volatile重排序表 能否重排序 第二個操作 第乙個操作 普通讀 寫 volatile讀 volatile寫 普通讀 寫 novolatile讀 nono novolatile寫 no...

如何保證執行緒安全有序性 執行緒池如何保證有序?

在生產環境中,用kafka來解耦是常用的技術手段。為了保證訊息的順序處理,會把相同屬性 同乙個人 同乙個素材等 的訊息發往kafka同乙個partition中。例如,在廣告系統中,會把某乙個ad的轉化資料傳送到同乙個partition。ad1 ad1 msg1,ad1 msg2,順序發到partit...

如何保證執行緒安全有序性 執行緒池如何保證有序?

背景 在生產環境中,用kafka來解耦是常用的技術手段。為了保證訊息的順序處理,會把相同屬性 同乙個人 同乙個素材等 的訊息發往kafka同乙個partition中。例如,在廣告系統中,會把某乙個ad的轉化資料傳送到同乙個partition。ad1 ad1 msg1,ad1 msg2,順序發到par...