說明
1、對于final域的內存語義,編譯器和處理器要遵守兩個重排序規則(內部實現也是使用內存屏障):
2、寫final域的重排序規則:在構造函數內對一個final域的寫入,與隨后把這個被構造對象的引用賦值給一個引用變量,這兩個操作之間不能重排序。
讀final域的重排序規則:初次讀一個包含final域的對象的引用,與隨后初次讀這個final域,這兩個操作之間不能重排序。
實例
public class FinalExample {
int i;//普通域
final int j;//final域
static FinalExample obj;
public FinalExample () {
i = 1;//寫普通域。對普通域的寫操作【可能會】被重排序到構造函數之外
j = 2;//寫final域。對final域的寫操作【不會】被重排序到構造函數之外
}
// 寫線程A執行
public static void writer () {
obj = new FinalExample ();
}
// 讀線程B執行
public static void reader () {
FinalExample object = obj;//讀對象引用
int a = object.i;//讀普通域。可能會看到結果為0(由于i=1可能被重排序到構造函數外,此時y還沒有被初始化)
int b = object.j;//讀final域。保證能夠看到結果為2
}
}
以上就是java中final域的內存語義理解,希望對大家有所幫助。更多關于“java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學,課程大綱緊跟企業需求,更科學更嚴謹,每年培養泛IT人才近2萬人。不論你是零基礎還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽。