1. 程式人生 > >java併發程式設計的藝術(二)---重排序與volatile、final關鍵字

java併發程式設計的藝術(二)---重排序與volatile、final關鍵字

重排序:是指編譯器和處理器為了優化程式效能而對指令序列進行重新排序的一種手段。

當資料依賴的時候不允許產生重排序,多執行緒有些情況下重排序會影響語義。

volatile 定義的的物件記憶體對多執行緒之間是立馬可見的,他建立了先寫後讀happens-before關係,常用來在多執行緒中進行flag標誌位的判斷,當A執行緒寫入volatile變數時,會立馬重新整理值到主記憶體並且同時通知B執行緒修改訊息,B執行緒中讀取該物件值時會被jvm中的執行緒記憶體標記為無效再去讀取一次。

final 的重排序:

  1. 在建構函式內對一個 final 域的寫入,與隨後把這個被構造物件的引用賦值給一個引用變數,這兩個操作之間不能重排序。
  2. 初次讀一個包含 final 域的物件的引用,與隨後初次讀這個 final 域,這兩個操作之間不能重排序。