final 變量在併發當中,原理是通過禁止cpu的指令集重排序來提供線程的可見性,來保證對象的安全發佈,防止對象引用被其他線程在對象被完全構造完成前拿到並使用。
與鎖和volatile相比較,對final域的讀和寫更像是普通的變量訪問。對於final域,編譯器和處理器要遵守兩個重排序規則:
- 在構造函數內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變量,這兩個操作之間不能重排序。
- 初次讀一個包含final域的對象的引用,與隨後初次讀這個final域,這兩個操作之間不能重排序。
與Volatile 有相似作用,不過Final主要用於不可變變量(基本數據類型和非基本數據類型),進行安全的發佈(初始化)。而Volatile可以用於安全的發佈不可變變量,也可以提供可變變量的可見性。
final 字段是必須在構造函數退出之前初始化完成。