国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java中的各種引用類型以及部分引用的相關(guān)例子

這篇具有很好參考價(jià)值的文章主要介紹了Java中的各種引用類型以及部分引用的相關(guān)例子。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

引用類型

在Java中,引用類型主要有四種,分別是:強(qiáng)引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)和虛引用(Phantom Reference)。這些類型通常與垃圾回收機(jī)制有關(guān),用來描述對(duì)象的生命周期和可達(dá)性。下面詳細(xì)介紹每一種引用類型:

  1. 強(qiáng)引用(Strong Reference)
    強(qiáng)引用是最常見的引用類型,當(dāng)在代碼中創(chuàng)建一個(gè)對(duì)象并賦值給一個(gè)引用變量時(shí),這個(gè)引用就是強(qiáng)引用。例如:

    String str = new String("Java");
    

    只要強(qiáng)引用還存在,垃圾回收器永遠(yuǎn)不會(huì)回收被引用的對(duì)象。強(qiáng)引用可能導(dǎo)致內(nèi)存泄漏,因?yàn)榧词箤?duì)象已經(jīng)不再需要了,只要強(qiáng)引用還在,對(duì)象就不會(huì)被回收。

  2. 軟引用(Soft Reference)
    軟引用是為了解決內(nèi)存敏感的緩存問題而設(shè)計(jì)的。通過java.lang.ref.SoftReference類可以創(chuàng)建軟引用。垃圾回收器在系統(tǒng)內(nèi)存不足時(shí)會(huì)回收這些對(duì)象。軟引用通常用于實(shí)現(xiàn)內(nèi)存敏感的高速緩存,例如,圖片緩存。軟引用可以讓緩存的對(duì)象在內(nèi)存充足時(shí)被保留,而在內(nèi)存不足時(shí)被回收。

    SoftReference<String> softReference = new SoftReference<>(new String("Java"));
    
  3. 弱引用(Weak Reference)
    弱引用通過java.lang.ref.WeakReference類實(shí)現(xiàn)。弱引用不阻止它的對(duì)象被垃圾回收器回收。垃圾回收器一旦發(fā)現(xiàn)只有弱引用指向的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它。弱引用比軟引用更弱,它主要用于實(shí)現(xiàn)沒有阻止垃圾收集的引用鏈,例如,常見于元數(shù)據(jù)、查找大型結(jié)構(gòu)的關(guān)鍵等。

    WeakReference<String> weakReference = new WeakReference<>(new String("Java"));
    
  4. 虛引用(Phantom Reference)
    虛引用是最弱的一種引用類型,通過java.lang.ref.PhantomReference類實(shí)現(xiàn)。一個(gè)具有虛引用的對(duì)象,跟沒有引用一樣,在任何時(shí)候都可能被垃圾回收器回收。設(shè)置虛引用的唯一目的是在這個(gè)對(duì)象被回收時(shí)收到一個(gè)系統(tǒng)通知。虛引用必須和引用隊(duì)列(ReferenceQueue)聯(lián)合使用。虛引用主要用于跟蹤對(duì)象被垃圾回收的活動(dòng),例如,確保對(duì)象完全銷毀后進(jìn)行某些特定資源的清理。

    PhantomReference<String> phantomReference = new PhantomReference<>(new String("Java"), new ReferenceQueue<>());
    

弱引用

合理的使用弱引用可以解決部分內(nèi)存泄漏的問題。

ThreadLocal

ThreadLocal是Java中多線程編程中一個(gè)重要的類。它能夠?qū)⒅荡鎯?chǔ)在當(dāng)前線程中,不與其他線程共享,同時(shí)讓編碼者能夠跨越多個(gè)層級(jí)獲取到該值。比如在Web服務(wù)中我們可以使用ThreadLocal存儲(chǔ)請(qǐng)求的id,從而使得該次請(qǐng)求中所有的日志輸出都攜帶上請(qǐng)求id,方便后續(xù)的異常排查;又或是如同Spring Transaction的實(shí)現(xiàn)一樣,將Connection存儲(chǔ)在ThreadLocal,讓一個(gè)線程綁定一個(gè)Connection,實(shí)現(xiàn)事務(wù)機(jī)制。

ThreadLocal實(shí)現(xiàn)解析:
ThreadLocal的本身的實(shí)現(xiàn)就是弱引用使用的一個(gè)經(jīng)典案例。
Java中的各種引用類型以及部分引用的相關(guān)例子
Java中的各種引用類型以及部分引用的相關(guān)例子
上面是ThreadLocal的get方法,可以看到它先是獲取當(dāng)前的線程之后再獲取了線程中的ThreadLocalMap實(shí)例,接著從該Map中獲取到具體的值。也就是說ThreadLocal實(shí)際上是通過每一個(gè)線程中存儲(chǔ)一個(gè)單獨(dú)的ThreadLocalMap實(shí)例來實(shí)現(xiàn)的。

接下來查看ThreadLocalMap的源碼:
Java中的各種引用類型以及部分引用的相關(guān)例子
ThreadLocalMap是ThreadLocal的一個(gè)內(nèi)部類,它的Entry繼承自WeakReference,結(jié)合Entry的構(gòu)造方法可以發(fā)現(xiàn)Entry是持有了一個(gè)指向ThreadLocal實(shí)例的弱引用并且使用該弱引用作為Key。如此實(shí)現(xiàn),當(dāng)外部沒有指向該ThreadLocal的軟引用、強(qiáng)引用之后,該ThreadLocal實(shí)例將會(huì)被直接回收。這樣做帶來的一個(gè)好處就是,在我們不需要該ThreadLocal對(duì)象之后,這個(gè)ThreadLocal能夠及時(shí)的被GC回收,保證不會(huì)因此導(dǎo)致內(nèi)存泄漏。

有一個(gè)經(jīng)典問題:ThreadLocal是如何導(dǎo)致內(nèi)存泄漏的?
首先ThreadLocal自身提供了remove方法,上面說了ThreadLocalMap的實(shí)現(xiàn)保證了程序不會(huì)因?yàn)門hreadLocal導(dǎo)致內(nèi)存泄漏,那這個(gè)問題是不是與上面所說的沖突了?其實(shí)不然,從前面的代碼可以看到ThreadLocalMap的Entry.key雖然是弱引用,但是Entry.value并不是弱引用。當(dāng)ThreadLocal被GC回收之后,并且我們?cè)诨厥罩皼]有顯示調(diào)用remove方法,我們便無法訪問到對(duì)應(yīng)的Entry,從而將該Entry刪除,那么始終便存在一條這樣的引用鏈路Thread->ThreadLocalMap->Entry->value,在線程被結(jié)束之前該value以及該Entry無法被回收,若是該線程無法沒及時(shí)結(jié)束,那么就有可能導(dǎo)致內(nèi)存泄漏。

可能會(huì)有人問為何不將Entry以及Entry.value也實(shí)現(xiàn)為弱引用?答案也很簡單,若是實(shí)現(xiàn)為弱引用,那么很多情況下通過ThreadLocal獲取一開始存入的值都將為null,在非特殊情況下,
ThreadLocal的作用可以說是等于零。

綜上所述,在編碼的時(shí)候,只要合理的調(diào)用remove方法其實(shí)就能夠避免因ThreadLocal導(dǎo)致的內(nèi)存泄漏。

WeakHashMap

Java中還有其他地方也使用到了弱引用,比如WeakHashMap。

  • 相比ThreadLocal,WeakHashMap也是通過將對(duì)象的軟引用作為entry.key,但是與ThreadLocal最大的不同就是它同時(shí)使用了ReferenceQueue,ReferenceQueue提供了在引用對(duì)象被GC回收時(shí),通知給程序的功能,WeakHashMap借此實(shí)現(xiàn)了在get等方法調(diào)用時(shí),自動(dòng)刪除被回收key所對(duì)應(yīng)條目的功能。

使用案例:

import java.util.WeakHashMap;

public class WeakCache {
    private final WeakHashMap<Key, BigObject> weakMap = new WeakHashMap<>();

    public void put(Key key, BigObject object) {
        weakMap.put(key, object);
    }

    public BigObject get(Key key) {
        return weakMap.get(key);
    }

    // Key類用于映射的鍵
    class Key {
        // ...
    }

    // BigObject類是一個(gè)大對(duì)象,占用大量內(nèi)存
    class BigObject {
        // ...
    }
}

WeakCache 類中,通過WeakHashMap 實(shí)現(xiàn)了一個(gè)弱引用鍵的緩存。當(dāng)Key沒有在其他地方被強(qiáng)引用時(shí),這個(gè)Key-Value映射隨時(shí)都可能被自動(dòng)移除。文章來源地址http://www.zghlxwxcb.cn/news/detail-850184.html

到了這里,關(guān)于Java中的各種引用類型以及部分引用的相關(guān)例子的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ElasticSearch進(jìn)階:多種查詢操作,各種ES查詢以及在Java中的實(shí)現(xiàn)

    ElasticSearch進(jìn)階:多種查詢操作,各種ES查詢以及在Java中的實(shí)現(xiàn)

    目錄 前言 1 詞條查詢 1.1 等值查詢-term 1.2 多值查詢-terms 1.3 范圍查詢-range 1.4 前綴查詢-prefix 1.5 通配符查詢-wildcard 2 復(fù)合查詢 2.1 布爾查詢 2.2 Filter查詢 3 聚合查詢 3.1 最值、平均值、求和 3.2 去重查詢 3.3 分組聚合 3.3.1 單條件分組 3.3.2 多條件分組 3.4 過濾聚合 ElasticSearch 第一篇

    2024年02月02日
    瀏覽(26)
  • 程序的各種段以及堆棧相關(guān)問題

    程序的各種段以及堆棧相關(guān)問題

    C中一般有三種變量: 局部變量 全局變量 靜態(tài)變量 C中一般有五個(gè)內(nèi)存段: 代碼段 也叫文本段,包含frequently executed code 通常是只讀的(未了避免程序被錯(cuò)誤改寫) 代碼段是不包含程序變量(如局部變量、全局變量)的 代碼段可以包含只讀的string字符,如包含代碼 printf(\\\"H

    2024年02月05日
    瀏覽(25)
  • 【六大鎖策略-各種鎖的對(duì)比-Java中的Synchronized鎖和ReentrantLock鎖的特點(diǎn)分析-以及加鎖的合適時(shí)機(jī)】

    【六大鎖策略-各種鎖的對(duì)比-Java中的Synchronized鎖和ReentrantLock鎖的特點(diǎn)分析-以及加鎖的合適時(shí)機(jī)】

    閱讀該文章之前要了解,鎖策略是為了解決什么問題 多線程帶來的的風(fēng)險(xiǎn)-線程安全的問題的簡單實(shí)例-線程不安全的原因 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 鎖沖突是指兩個(gè)線程對(duì)一個(gè)對(duì)象加鎖,產(chǎn)生了阻塞等待。 樂觀鎖 假設(shè)數(shù)據(jù)一般情況下不會(huì)產(chǎn)生并發(fā)沖

    2024年02月15日
    瀏覽(25)
  • 重溫C#中的值類型和引用類型

    在C#中,數(shù)據(jù)類型分為 值類型 和 引用類型 兩種。 引用類型變量存儲(chǔ)的是數(shù)據(jù)的引用,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆中,而值類型變量直接存儲(chǔ)數(shù)據(jù)。對(duì)于引用類型,兩個(gè)變量可以引用同一個(gè)對(duì)象。因此,對(duì)一個(gè)變量的操作可能會(huì)影響另一個(gè)變量引用的對(duì)象。對(duì)于值類型,每個(gè)變量都有

    2024年02月15日
    瀏覽(22)
  • C++引用的相關(guān)定義以及使用場景與指針之前的區(qū)別

    C++引用的相關(guān)定義以及使用場景與指針之前的區(qū)別

    ??博客主頁: 主頁 ??系列專欄: C++ ??感謝大家點(diǎn)贊??收藏?評(píng)論?? ??期待與大家一起進(jìn)步! 引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。 引用的特性: 引用在定義時(shí)必

    2024年02月03日
    瀏覽(27)
  • JavaScript中的數(shù)據(jù)類型可以分為兩類:原始類型和引用類型。

    JavaScript中的數(shù)據(jù)類型可以分為兩類:原始類型和引用類型。 JavaScript中的原始類型有五種,分別是: 數(shù)字(Number):表示數(shù)字,包括整數(shù)和浮點(diǎn)數(shù)。 字符串(String):表示文本字符串。 布爾值(Boolean):表示邏輯上的真或假。 undefined:表示未定義的值。 null:表示空值。

    2024年01月24日
    瀏覽(30)
  • sql知識(shí)點(diǎn)復(fù)習(xí)以及項(xiàng)目中的例子

    sql知識(shí)點(diǎn)復(fù)習(xí)以及項(xiàng)目中的例子

    ? 常見的聚合函數(shù): avg(),求平均值;?sum() 求和; count(),計(jì)算和;?min()求最小值; max()求最大值 聚合函數(shù)的應(yīng)用場景: COUNT:用于統(tǒng)計(jì)指定列的行數(shù),可以用于統(tǒng)計(jì)表中的記錄數(shù)或者去重后的記錄 數(shù)。 SUM:用于計(jì)算指定列的總和,可以用于計(jì)算某個(gè)時(shí)間段

    2023年04月19日
    瀏覽(27)
  • 快速清除Java項(xiàng)目中引用的各種包的安全漏洞

    Java項(xiàng)目中往往會(huì)使用很多第三方類庫或開源類庫。在完成項(xiàng)目開發(fā),并準(zhǔn)備上線時(shí),經(jīng)常需要做漏洞掃描。一旦掃描出的上千的漏洞往往會(huì)讓我們不知所措。如果上線要求非常嚴(yán)格,針對(duì)漏掃結(jié)果,我們需要逐個(gè)jar包查找有沒有對(duì)應(yīng)的升級(jí)或補(bǔ)丁。而即便我們找到了升級(jí)Ja

    2024年02月11日
    瀏覽(43)
  • Java 四種引用類型(強(qiáng)引用、軟引用、弱引用、虛引用)

    在 Java 中,基本類型和引用類型是兩種不同的數(shù)據(jù)類型 基本類型直接表示數(shù)值、字符或布爾值,直接將值存儲(chǔ)在內(nèi)存,包括 byte、short、int?、long、float?、double、char、boolean 引用類似 C 語言中的指針,在內(nèi)存中存儲(chǔ)的是對(duì)象的引用而不是對(duì)象本身,通過這個(gè)引用可以操作對(duì)象

    2024年02月05日
    瀏覽(24)
  • 3dmax2021 中的各種顯示相關(guān)如何設(shè)置?

    3dmax2021 中的各種顯示相關(guān)如何設(shè)置?

    這就是一盞燈和兩盞燈的差別 注意,視圖模式不要選擇standard標(biāo)準(zhǔn)模式,在這種模式下,即使是兩盞燈,也會(huì)是這樣子 這個(gè)稍微顯得復(fù)雜,要經(jīng)過兩步,第一步在View菜單下選擇viewport config,如圖設(shè)置: 然后后,選擇Customize菜單中的Customize User Interface: 這個(gè)功能可以省去我們

    2024年02月05日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包