final域的記憶體語義

2021-07-10 16:14:18 字數 579 閱讀 5491

對於final域,編譯器和處理器要遵守兩個重排序規則。

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

2,初次讀入乙個包含final域的物件的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序。

寫final域的重排序規則

1,jmm禁止編譯器把final域的寫重排序到建構函式以外;

2,編譯器會在final域的寫之後,建構函式return之前,插入乙個storestore屏障。這個屏障禁止處理器把final域的寫重排序到建構函式之外。

讀final域的重排序規則

讀final域的重排序規則是,在乙個執行緒中,初次讀物件引用與初次讀該物件包含的final域,jmm禁止處理器重排序這兩個操作。編譯器會在讀final域操作的之前插入乙個loadload屏障。

初次讀物件與初次讀該物件包含的final域,這兩個操作之間存在間接依賴關係。由於編譯器遵守間接依賴關係,因此編譯器不會重排序這兩個操作。大多數處理器也會遵守間接依賴,也不會重排序這兩個操作。但有少數處理器允許對存在間接關係的操作做重排序,這個規則就是專門用來針對這種處理器的。

Java併發 final域的記憶體語義

對於final域,編譯器和處理器都要遵守兩個重排序規則 1 在建構函式內對乙個final域的寫入,與隨後把這個被構造物件的引用賦值給乙個引用變數,這兩個操作之間不能重排序。2 初次讀乙個包含final域的物件的引用,與隨後初次讀這個final域,這兩個操作之間不能重排。寫final域的重排序規則禁止...

final關鍵字記憶體語義

對於final修飾的變數,其實有兩個與指重排相關的規則 我們所書寫的 順序和jvm執行的指令順序不一定是相同的,jvm會在不影響執行正確性的前提下對指令進行重排序,以達到提高執行效率的目的。當然,這個正確性指的是單執行緒下的正確性,如果是多執行緒的話,jvm是無法判斷的。如果final變數在建構函式...

Java volatile的記憶體語義

volatile變數自身具有下列特性 可見性。對乙個volatile變數讀,總是能看到 任意執行緒 對這個volatile變數最後的寫入。原子性。對任意單個volatile變數的讀 寫具有原子性,但類似volatile這種復合操作不具有原子性。volatile寫 讀的記憶體語義 當寫乙個volati...