虛引用詳解與示例詳細剖析


虛引用再論:

在上一次https://www.cnblogs.com/webor2006/protected/p/12660674.html學習了虛引用,其中還拋出了2個問題,回憶一下:

而先來看一下PhatomReference的方法定義:

其實對於上面的這兩個問題可以從它的官方說明中找到答案,對於PhantomReference類在之前https://www.cnblogs.com/webor2006/p/12110089.html已經解讀過了,回憶一下:

其中第一個問題“為啥PhatomReference的get()方法直接返回null?”,它的答案在這句話上:

如何理解?這里其實可以用一個假設法,假如我們可以通過它的get()方法獲取它里面的referent對象的話,那么是不是我們可以用一個引用指向這個referent對象呢?那這種引用就有可能是強、軟、弱三種情況出現,而如果是被強引用的話肯定該referent對象是不可能被回收的,那很明顯就不滿足虛引用的規則了,同樣的如果被軟、弱引用也會干擾到referent對象的回收的,所以這也是為啥get()方法永遠返回null的原因,這里看一下get()方法的說明:

好,接下來再來解釋一下第二個問題“為啥PhatomReference的構造方法只有接收兩個參數(referent與queue)的這一種形式,而沒有只接收referent這唯一參數的構造方法呢?像其它兩個引用都有兩個構造存在...”,先來看一下構造的說明:

而要想解釋為啥只提供一個帶隊列的構造的原因,這里就得從虛引用的使用場景來解釋了,如下:

當我們將一個對象封裝到PhatomReference中時,這就意味着我們將永遠也無法再訪問到這個對象了,因為PhatomReference的get方法永遠都會返回null;PhatomReference的主要作用並不在於可以讓我們獲取到其中封裝的referent,而是在於當垃圾收集器回收其referent時,這個PhatomReference會被放置到與其關聯的隊列中,並且得到相應的通知,這就是PhatomReference存在的唯一目的

其中加粗的說明文字就能很好的解釋了為啥只提供了一個帶隊列的構造函數了。

弱引用再論:

在上一次中,對於虛引用的示例中其實做了一個伏筆,回憶一下:

而根據弱引用的特點:

很明顯咱們已經調了system.gc()了,當然我們也知道調這個不一定能讓垃圾收集器進行真正的gc,但是為啥我們睡眠了5秒之久,一次也沒看到弱引用對象被回收的結果呢?其實是可以達到我們想要的回收效果的,這里先分析一下為啥目前的代碼看不到弱引用被回收的效果呢?

很明顯弱引用引用了堆中的Date對象了,而造成看不到gc效果的原因在於這句話:

這個引用屬於“”引用!!!!!哦,強引用對象的特點就能知道為啥看不到弱引用對象得不到回收的原因了,知道了原因之后,下面增加一句代碼則就可以看到被回收的效果了,如下:

好,最后咱們再來對比一下軟引用手動gc的情況:

這是因為:

而它的回收時機是在內存比較緊張的時候才會,並非垃圾回收器一掃描到就立馬被回收,回憶一下這塊的說明:

通過這樣來回的探究,對於四大引用應該是非常之清楚了,還是相當有價值的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM