課程
/后端開發(fā)
/Java
/細(xì)說Java多線程之內(nèi)存可見性
為什么VolatileDemo要加final修飾?
2016-05-23
源自:細(xì)說Java多線程之內(nèi)存可見性 4-2
正在回答
因?yàn)樯芷诘脑?。方法中的局部變量,方法結(jié)束后這個(gè)變量就要釋放掉,final保證這個(gè)變量始終指向一個(gè)對象。首先,內(nèi)部類和外部類其實(shí)是處于同一個(gè)級(jí)別,內(nèi)部類不會(huì)因?yàn)槎x在方法中就會(huì)隨著方法的執(zhí)行完畢而跟隨者被銷毀。問題就來了,如果外部類的方法中的變量不定義final,那么當(dāng)外部類方法執(zhí)行完畢的時(shí)候,這個(gè)局部變量肯定也就被GC了,然而內(nèi)部類的某個(gè)方法還沒有執(zhí)行完,這個(gè)時(shí)候他所引用的外部變量已經(jīng)找不到了。如果定義為final,Java會(huì)將這個(gè)變量復(fù)制一份作為成員變量內(nèi)置于內(nèi)部類中,這樣的話,由于final所修飾的值始終無法改變,所以這個(gè)變量所指向的內(nèi)存區(qū)域就不會(huì)變。
檸檬醬c
客氣,共同學(xué)習(xí)么。。、
懂了,謝謝大神! ^_^
舉報(bào)
用兩種方式實(shí)現(xiàn)內(nèi)存可見性,代領(lǐng)大家深層次學(xué)習(xí)Java中的內(nèi)存
2 回答java多線程中共享變量是不是一定要private修飾?
9 回答不是說volatile不保證原子性嗎?為什么對于64位類型的變量用volatile修飾?
2 回答final的作用
1 回答volatile 加不加線程都可以訪問啊,這是為什么?
5 回答被synchronized修飾,依然出現(xiàn)兩種結(jié)果0和6,是我代碼寫得有問題?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2016-05-24
因?yàn)樯芷诘脑?。方法中的局部變量,方法結(jié)束后這個(gè)變量就要釋放掉,final保證這個(gè)變量始終指向一個(gè)對象。
首先,內(nèi)部類和外部類其實(shí)是處于同一個(gè)級(jí)別,內(nèi)部類不會(huì)因?yàn)槎x在方法中就會(huì)隨著方法的執(zhí)行完畢而跟隨者被銷毀。問題就來了,如果外部類的方法中的變量不定義final,那么當(dāng)外部類方法執(zhí)行完畢的時(shí)候,這個(gè)局部變量肯定也就被GC了,然而內(nèi)部類的某個(gè)方法還沒有執(zhí)行完,這個(gè)時(shí)候他所引用的外部變量已經(jīng)找不到了。如果定義為final,Java會(huì)將這個(gè)變量復(fù)制一份作為成員變量內(nèi)置于內(nèi)部類中,這樣的話,由于final所修飾的值始終無法改變,所以這個(gè)變量所指向的內(nèi)存區(qū)域就不會(huì)變。
2016-06-23
客氣,共同學(xué)習(xí)么。。、
2016-05-26
懂了,謝謝大神! ^_^