final關(guān)鍵字的理解

?????在Java中腌巾,final關(guān)鍵字可以用來(lái)修飾類(lèi)杠袱、方法和變量(類(lèi)變量和實(shí)例變量以及局部變量)昵济,在Java中做到了無(wú)孔不入智绸,這些都是在語(yǔ)法層面的限制,在編譯期就會(huì)限制住访忿。其作用如下:

  • final修飾的類(lèi):不能被繼承
  • final修飾的方法:不能被重寫(xiě)瞧栗,但是可以重載
  • final修飾的變量:不能被修改,如果修飾的是引用的時(shí)候海铆,引用所指向的地址值不能修改迹恐,但是引用所指的對(duì)象內(nèi)部變量值可以被修改。

?????final內(nèi)存語(yǔ)義:但是final在多線程中的內(nèi)存語(yǔ)義很多時(shí)候都會(huì)被忽略了卧斟,在Java中為了提高程序的運(yùn)行效率殴边,編譯器和處理器都有可能會(huì)重排序。final在多線程中的內(nèi)存語(yǔ)義如下:

  • 在構(gòu)造函數(shù)內(nèi)對(duì)final域數(shù)據(jù)的寫(xiě)入珍语,與隨后把這個(gè)被構(gòu)造的對(duì)象賦值一個(gè)引用之間锤岸,這兩個(gè)操作之間是不允許重排序的。
  • 在讀一個(gè)對(duì)象引用與隨后讀對(duì)象final域數(shù)據(jù)之間板乙,這兩個(gè)操作之間是不允許重排序的是偷。
public class FinalTest {

    private int i;

    private final int value;

    static FinalTest object;

    public FinalTest() {
        i = 1;
        value = 2;
    }

    public static void write() {
        object = new FinalTest();
    }

    public static void read() {
        FinalTest obj = object;//@1
        System.out.println(obj.i);
        System.out.println(obj.value);//@2
    }

    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(() -> FinalTest.write());
        Thread t2 = new Thread(() -> FinalTest.read());
        t1.start();
        t2.start();
        Thread.sleep(10000);
    }
    
}

?????以上面的例子來(lái)說(shuō):

  • 對(duì)final寫(xiě)內(nèi)存語(yǔ)義來(lái)說(shuō),F(xiàn)inalTest構(gòu)造函數(shù)返回之前亡驰,final修飾的變量value已經(jīng)被賦值了晓猛,value = 2操作在構(gòu)造函數(shù)返回之前就已經(jīng)完成賦值。實(shí)現(xiàn)方式是有2步:禁止編譯器把final域的寫(xiě)重排序到構(gòu)造函數(shù)之后凡辱,并且在final域?qū)懼蠛蜆?gòu)造函數(shù)返回之前的地方插入一個(gè)storestore內(nèi)存屏障戒职,這樣就能禁止處理器在執(zhí)行的時(shí)候重排序。
  • 對(duì)final讀內(nèi)存語(yǔ)義來(lái)說(shuō)透乾,讀對(duì)應(yīng)引用操作和讀對(duì)象final域數(shù)據(jù)操作洪燥,兩者之間不能重排序磕秤。@1標(biāo)記的操作總是在@2標(biāo)記處的操作之前執(zhí)行。實(shí)現(xiàn)方式也是2步:禁止編譯器把讀對(duì)象引用和讀對(duì)象final域數(shù)據(jù)的兩步操作進(jìn)行重排序捧韵,并且在讀final域操作的前面插入loadload內(nèi)存屏障市咆。

?????final域的重排序的作用:在引用變量為任意線程可見(jiàn)之前,引用變量指向的對(duì)象的final域已經(jīng)在構(gòu)造函數(shù)中被正確初始化了再来。這里有個(gè)前提就是:該對(duì)象是被正確構(gòu)造的蒙兰,在構(gòu)造函數(shù)中沒(méi)有發(fā)生逸出。

public class FinalOut {

    final int value;

    static FinalOut object;

    public FinalOut() {
        value = 1;
        object = this;
    }

    public static void write() {
        new FinalOut();
    }

    public static void read() {
        if (object != null) {
            System.out.println(object.value);
        }
    }
}

?????這里的構(gòu)造函數(shù)中芒篷,就發(fā)生了this引用的逸出搜变,這樣的對(duì)象是沒(méi)有被正確構(gòu)造的,所以在這里final的內(nèi)存語(yǔ)義是沒(méi)有辦法保證的针炉。簡(jiǎn)單來(lái)說(shuō)挠他,只要對(duì)象被正確構(gòu)造,沒(méi)有發(fā)生對(duì)象this引用的逸出問(wèn)題篡帕,那么不需要使用同步殖侵,就可以保證任意線程都能看到這個(gè)對(duì)象的final域在構(gòu)造函數(shù)中被初始化的值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镰烧,一起剝皮案震驚了整個(gè)濱河市拢军,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怔鳖,老刑警劉巖朴沿,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異败砂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)魏铅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)昌犹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人览芳,你說(shuō)我怎么就攤上這事斜姥。” “怎么了沧竟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵铸敏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我悟泵,道長(zhǎng)杈笔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任糕非,我火速辦了婚禮蒙具,結(jié)果婚禮上球榆,老公的妹妹穿的比我還像新娘。我一直安慰自己禁筏,他們只是感情好持钉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著篱昔,像睡著了一般每强。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上州刽,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天空执,我揣著相機(jī)與錄音,去河邊找鬼怀伦。 笑死脆烟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的房待。 我是一名探鬼主播邢羔,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桑孩!你這毒婦竟也來(lái)了拜鹤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤流椒,失蹤者是張志新(化名)和其女友劉穎敏簿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宣虾,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惯裕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绣硝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜻势。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鹉胖,靈堂內(nèi)的尸體忽然破棺而出握玛,到底是詐尸還是另有隱情,我是刑警寧澤甫菠,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布挠铲,位于F島的核電站,受9級(jí)特大地震影響寂诱,放射性物質(zhì)發(fā)生泄漏拂苹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一痰洒、第九天 我趴在偏房一處隱蔽的房頂上張望醋寝。 院中可真熱鬧搞挣,春花似錦、人聲如沸音羞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嗅绰。三九已至舍肠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窘面,已是汗流浹背翠语。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留财边,地道東北人肌括。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酣难,于是被迫代替她去往敵國(guó)和親谍夭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容