JAVA 基礎(chǔ) 之 引用類(lèi)型

Java中的引用類(lèi)型包含四種:強(qiáng)摸航,軟,弱舅桩,虛

強(qiáng)引用

強(qiáng)引用就是我們平時(shí)使用的最多的引用類(lèi)型酱虎,比如:Object obj = new Object();

軟引用

public class SoftReference<T> extends Reference<T> {
}
JSONObject json = new JSONObject();
json.put("key", "json");
SoftReference<JSONObject> reference = new SoftReference<>(json);
reference.get().get("key");

這樣的寫(xiě)法就表面了json是一個(gè)軟引用,軟引用只有在內(nèi)存不足的時(shí)候才會(huì)被回收掉擂涛,所以軟引用很適合做緩沖使用

弱引用

public class WeakReference<T> extends Reference<T> {
    public WeakReference(T referent) {
        super(referent);
    }
    public WeakReference(T referent, ReferenceQueue<? super T> q) {
        super(referent, q);
    }
}

只有2個(gè)構(gòu)造函數(shù)一個(gè)是沒(méi)有隊(duì)列的读串,一個(gè)是有隊(duì)列的,
隊(duì)列的作用是存放已經(jīng)被回收了的對(duì)象信息撒妈。

JSONObject json = new JSONObject();
json.put("key", "json");
WeakReference<JSONObject> reference1 = new WeakReference<>(json);
reference1.get().get("key");

ReferenceQueue<JSONObject> queue = new ReferenceQueue<>();
WeakReference<JSONObject> reference2 = new WeakReference<>(json, queue);
Reference<? extends com.alibaba.fastjson.JSONObject> ref;
while ((ref = queue.poll()) != null ) {
    System.out.println("隊(duì)列中:" + reference2);
}

弱引用主要是用于ThreadLocal中
ThreadLocal:是線(xiàn)程間變量不可見(jiàn)的操作方式恢暖。
ThreadLocal在set值的時(shí)候,會(huì)獲取當(dāng)前上下文中的線(xiàn)程狰右,然后再獲取到當(dāng)前線(xiàn)程的threadLocalMap, 將ThreadLocal設(shè)置為key, 具體對(duì)象設(shè)置為threadLocalMap 的value,

public void set(T value) {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        map.set(this, value);
    } else {
        createMap(t, value);
    }
}
static class ThreadLocalMap {
    static class Entry extends WeakReference<ThreadLocal<?>> {
        Object value;
        Entry(ThreadLocal<?> k, Object v) {
            super(k);
            value = v;
        }
    }
}

使用ThreadLocal時(shí)需要注意的事情:
1):使用結(jié)束后要及時(shí)remove杰捂,因?yàn)椴籸emove可能會(huì)導(dǎo)致內(nèi)存泄漏:
首先從代碼上我們可以看出來(lái),Entry是繼承了WeakReference<ThreadLocal<?>>, 同時(shí)再給Entry設(shè)值的時(shí)候棋蚌,key是傳入到了super(k)中嫁佳,既:key變成了一個(gè)WeakReference,而value依然是Object的強(qiáng)引用谷暮,所以當(dāng)發(fā)生GC的時(shí)候脱拼,key馬上就被回收了,但是value卻一直存在變成了一種null – value這樣的存儲(chǔ)結(jié)構(gòu)坷备,使得value一直存留在了內(nèi)存中熄浓。
(其實(shí)這個(gè)地方比較繞,剛開(kāi)始的時(shí)候不好理解省撑,因?yàn)橛械娜松涎垡豢窗l(fā)現(xiàn)Entry繼承了WeakReference會(huì)想當(dāng)然的認(rèn)為整個(gè)Entry都是weakReference赌蔑,那一GC的時(shí)候整個(gè)Entry都沒(méi)有了,怎么可能會(huì)存在內(nèi)存泄漏問(wèn)題那竟秫?其實(shí)這個(gè)是2回事情娃惯,第一點(diǎn):WeakReference不存在繼承性;第二點(diǎn):只有被WeakReference引用了的對(duì)象才是弱引用肥败,Entry并沒(méi)有被WeakReference 引用所以Entry, value都是強(qiáng)引用)
2): 線(xiàn)程池不建議使用ThreadLocal,
因?yàn)榫€(xiàn)程池會(huì)復(fù)用線(xiàn)程趾浅,所以當(dāng)我們?cè)诂F(xiàn)場(chǎng)池中使用了ThreadLocal 忘記remove時(shí),線(xiàn)程池再次激活核心線(xiàn)程后會(huì)讀取到上一次的臟數(shù)據(jù)馒稍。

虛引用

虛引用主要是用來(lái)管理堆外內(nèi)存的皿哨,因?yàn)槲覀兊腏VM只能操作自己的堆內(nèi)存,不能操作OS的內(nèi)存纽谒,虛引用的底層是UnSafe類(lèi)(c++)可以直接清理OS的內(nèi)存证膨。

ReferenceQueue<JSONObject> queue1 = new ReferenceQueue<>();
PhantomReference<JSONObject> reference3 = new PhantomReference<>(json, queue);

創(chuàng)建虛引用時(shí)候需要指定一個(gè)隊(duì)列,發(fā)生GC的時(shí)候用于保存被回收后對(duì)象的引用鼓黔。虛引用在對(duì)象被釋放之前央勒,將把它對(duì)應(yīng)的虛引用添加到它關(guān)聯(lián)的引用隊(duì)列中不见,這使得可以在對(duì)象被回收之前采取一些清理工作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崔步,一起剝皮案震驚了整個(gè)濱河市稳吮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌井濒,老刑警劉巖盖高,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異眼虱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)席纽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)捏悬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人润梯,你說(shuō)我怎么就攤上這事过牙。” “怎么了纺铭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵寇钉,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我舶赔,道長(zhǎng)扫倡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任竟纳,我火速辦了婚禮撵溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锥累。我一直安慰自己缘挑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布桶略。 她就那樣靜靜地躺著语淘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪际歼。 梳的紋絲不亂的頭發(fā)上惶翻,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音鹅心,去河邊找鬼维贺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巴帮,可吹牛的內(nèi)容都是我干的溯泣。 我是一名探鬼主播虐秋,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼垃沦!你這毒婦竟也來(lái)了客给?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肢簿,失蹤者是張志新(化名)和其女友劉穎靶剑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體池充,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桩引,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了收夸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑匠。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卧惜,靈堂內(nèi)的尸體忽然破棺而出厘灼,到底是詐尸還是另有隱情,我是刑警寧澤咽瓷,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布设凹,位于F島的核電站,受9級(jí)特大地震影響茅姜,放射性物質(zhì)發(fā)生泄漏闪朱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一钻洒、第九天 我趴在偏房一處隱蔽的房頂上張望监透。 院中可真熱鬧,春花似錦航唆、人聲如沸胀蛮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)粪狼。三九已至,卻和暖如春任岸,著一層夾襖步出監(jiān)牢的瞬間再榄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工享潜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留困鸥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像疾就,于是被迫代替她去往敵國(guó)和親澜术。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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