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