十分鐘理解Java中的弱引用-編程開發(fā)技術(shù)_第1頁
十分鐘理解Java中的弱引用-編程開發(fā)技術(shù)_第2頁
十分鐘理解Java中的弱引用-編程開發(fā)技術(shù)_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、i 分鐘理解java中的弱引用-編程開發(fā)技術(shù)十分鐘理解java中的弱引用原文出處:absfree (簡卩作者)本篇文章嘗試從what. why、how這三個角度來探索jawai中的弱引用,幫助大家 理解jqvq中弱引用的定義、基木使用場景和使用方法。由于個人水平有限,敘 述屮難免存在不準(zhǔn)確或是不清晰的地方,希望大家可以指出,謝謝大家:)1. what什么是弱引用?java中的弱引用具體指的是java. lang. ref. weakreference<t>類,我們首先來 看一下官方文檔對它做的說明:弱引用對彖的存在不會阻止它所指向的對彖被垃圾回收器回收。弱 引用最常見的用途是實(shí)現(xiàn)規(guī)

2、范映射(canonicalizing mappings,比 如哈希表)。假設(shè)垃圾收集器在某個時間點(diǎn)決定一個對象是弱可達(dá)的(weakly reachable)(也就是說當(dāng)前指向它的全都是弱引用),這時垃圾收 集器會清除所冇指向該對彖的弱引用,然后把這個弱可達(dá)對彖標(biāo)記 為可終結(jié)(finalizable)的,這樣它隨后就會被冋收。與此同時或 稍后,垃圾收集器會把那些剛清除的弱引用放入創(chuàng)建弱引用對象吋 所指定的引用隊(duì)列(reference queue)中。實(shí)際上,java 11存在四種引用,它們由強(qiáng)到弱依次是:強(qiáng)引用、軟引用、弱引 用、虛引用。下面我們簡單介紹下除弱引用外的其他三種引用: 強(qiáng)引用(st

3、rong reference):通常我們通過new來創(chuàng)建一個新對象時返i叫的引用就是 一個強(qiáng)引用,若一個對象通過一系列強(qiáng)引用可到達(dá),它就是強(qiáng)可達(dá)的(strongly reachable),那么它就不被回收 軟引用(soft reference):軟引用和弱引用的區(qū)別在于,若一個對象是弱引用可達(dá), 無論當(dāng)前內(nèi)存是否充足它都會被冋收,而軟引用可達(dá)的對象在內(nèi)存不充足吋才會被 回收,因此軟引用要比弱引用“強(qiáng)''一些虛引用(phantom reference):虛引用是java中授弱的引用,那么它弱到什么程度 呢?它是如此脆弱以至于我們通過虛引用其至無法獲取到被引用的對象,虛引用存 在的

4、唯一作用就是當(dāng)它指向的對象被回收后,虛引用本身會被加入到引用隊(duì)列中, 用作記錄它指向的對象已被回收??紤]卜面的場景:現(xiàn)在有一個product類代表一種產(chǎn)品,這個類被設(shè)計(jì)為不可擴(kuò) 展的,而此時我們想要為每個產(chǎn)品增加一個編號。一種解決方案是使用 hashmap<product, integer。于是問題來了,如果我們已經(jīng)不再需要一個 product對象存在于內(nèi)存屮(比如已經(jīng)賣出了這件產(chǎn)品),假設(shè)指向它的引用為 producta,我們這時會給producta賦值為nul 1,然而這時producta過去指向 的product對象并不會被回收,因?yàn)樗@然還被llashmap引用著。所以這種情況

5、下,我們想要真正的回收一個product對象,僅僅把它的強(qiáng)引用賦值為null是 不夠的,還要把相應(yīng)的條目從hashmap中移除。顯然“從hashmap中移除不再需 要的條口”這個工作我們不想自己完成,我們希望告訴垃圾收集器:在只有 hashmap中的key在引用著product對象的情況下,就口j以回收相應(yīng)product對 象了。顯然,根據(jù)前面弱引用的定義,使用弱引用能幫助我們達(dá)成這個目的。我 們只需耍用一個指向product對彖的弱引用對象來作為hashmap屮的key就可以 tohow如何使用弱引用?拿上面介紹的場景舉例,我們使用一個指向product對象的弱引用對象來作為 hashmap

6、的key,只需這樣定義這個弱引用對象:product producta = new product();weakreferenceproduct> weakproducta 二 new weakreference>(producta);現(xiàn)在,若引用對象weakproducta就指向了 product對象productao那么我們怎 么通過weakproduct獲取它所指向的product對彖producta呢?很簡單,只需 要下面這句代碼:product product = weakproducta. get();實(shí)際上,對于這種情況,java類庫為我們提供了 weakhashma

7、p類,使用和這個 類,它的鍵自然就是弱引用對象,無需我們再手動包裝原始對象。這樣一來,當(dāng) producta變?yōu)閚ull時(表明它所引用的product已經(jīng)無需存在于內(nèi)存中),這 時指向這個product對彖的就是由弱引用對彖weakproducta 了,那么顯然這時 候相應(yīng)的product對象時弱可達(dá)的,所以指向它的弱引用會被清除,這個product 對象隨即會被回收,指向它的弱引用對象會進(jìn)入引用隊(duì)列屮。引用隊(duì)列下而我們來簡單地介紹下引用隊(duì)列的概念。實(shí)際上,weakreference類冇兩個構(gòu) 造函數(shù):創(chuàng)建一個指向給定對象的弱引用weakreference(t referent)創(chuàng)建一個指向給定對象并且登記到給定引用隊(duì)列的弱引用weakreference (t referent, referencequeue<? super t> q) 我們可以看到第二個構(gòu)造方法中提供了一個referencequeue類型的參數(shù),通過 提供這個參數(shù),我們便把創(chuàng)建的弱引用對象注冊到了一個引用隊(duì)列上,這樣當(dāng)它 被垃圾冋收器清

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論