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