(1)對於final域,編譯器和處理器要遵守兩個重排序規則
- 在構造函數內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變量,這兩個操作之間不能重排序
- 初次讀一個包含final域的對象的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序。
(2)寫final域的重排序規則禁止把final域的寫重排序到構造函數之外。這個規則的實現包含兩個方面
- JMM禁止編譯器把final域的寫重排序到構造函數之外。
- 編譯器會在final域的寫之後,構造函數return之前,插入一個StoreStore屏障。這個屏障禁止處理器把final域的寫重排序到構造函數之外