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

史上最全ThreadLocal 詳解(二)

這篇具有很好參考價值的文章主要介紹了史上最全ThreadLocal 詳解(二)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

ThreadLocal 內(nèi)存泄露的原因及處理方式

目錄

1、ThreadLocal 使用原理

2、ThreadLocal 內(nèi)存泄露的原因

3、 為什么不將key設置為強引用

3.1 、key 如果是強引用

3.2、key 如果是強引用

3.3??那么為什么 key 要用弱引用

3.4 如何正確的使用ThreadLocal


1、ThreadLocal 使用原理

? ? ? ?前文我們講過ThreadLocal的主要用途是實現(xiàn)線程間變量的隔離,表面上他們使用的是同一個ThreadLocal, 但是實際上使用的值value卻是自己獨有的一份。用一圖直接表示threadlocal 的使用方式。
史上最全threadlocal 詳解(二),java并發(fā)編程,java 學習,java,開發(fā)語言

圖1

從圖中我們可以當線程使用threadlocal 時,是將threadlocal當做當前線程thread的屬性ThreadLocalMap 中的一個Entry的key值,實際上存放的變量是Entry的value值,我們實際要使用的值是value值。value值為什么不存在并發(fā)問題呢,因為它只有一個線程能訪問。threadlocal我們可以當做一個索引看待,可以有多個threadlocal 變量,不同的threadlocal對應于不同的value值,他們之間互不影響。ThreadLocal為每一個線程都提供了變量的副本,使得每個線程在某一時間訪問到的并不是同一個對象,這樣就隔離了多個線程對數(shù)據(jù)的數(shù)據(jù)共享。

2、ThreadLocal 內(nèi)存泄露的原因 ?

?Entry將ThreadLocal作為Key,值作為value保存,它繼承自WeakReference,注意構(gòu)造函數(shù)里的第一行代碼super(k),這意味著ThreadLocal對象是一個「弱引用」??梢钥磮D1.

static class Entry extends WeakReference<ThreadLocal<?>> {
    /** The value associated with this ThreadLocal. */
    Object value;
    Entry(ThreadLocal<?> k, Object v) {
        super(k);
        value = v;
    }
}

主要兩個原因
1 . 沒有手動刪除這個 Entry
2 . CurrentThread 當前線程依然運行

????????第一點很好理解,只要在使用完下 ThreadLocal ,調(diào)用其 remove 方法刪除對應的 Entry ,就能避免內(nèi)存泄漏。
????????第二點稍微復雜一點,由于ThreadLocalMap 是 Thread 的一個屬性,被當前線程所引用,所以ThreadLocalMap的生命周期跟 Thread 一樣長。如果threadlocal變量被回收,那么當前線程的threadlocal 變量副本指向的就是key=null, 也即entry(null,value),那這個entry對應的value永遠無法訪問到。實際私用ThreadLocal場景都是采用線程池,而線程池中的線程都是復用的,這樣就可能導致非常多的entry(null,value)出現(xiàn),從而導致內(nèi)存泄露。
綜上, ThreadLocal 內(nèi)存泄漏的根源是:
? ? 由于ThreadLocalMap 的生命周期跟 Thread 一樣長,對于重復利用的線程來說,如果沒有手動刪除(remove()方法)對應 key 就會導致entry(null,value)的對象越來越多,從而導致內(nèi)存泄漏.

3、 為什么不將key設置為強引用

3.1 、key 如果是強引用

? ? ?那么為什么ThreadLocalMap的key要設計成弱引用呢?其實很簡單,如果key設計成強引用且沒有手動remove(),那么key會和value一樣伴隨線程的整個生命周期。

? ?1、假設在業(yè)務代碼中使用完ThreadLocal, ThreadLocal ref被回收了,但是因為threadLocalMap的Entry強引用了threadLocal(key就是threadLocal), 造成ThreadLocal無法被回收。在沒有手動刪除Entry以及CurrentThread(當前線程)依然運行的前提下, 始終有強引用鏈CurrentThread Ref → CurrentThread →Map(ThreadLocalMap)-> entry, Entry就不會被回收( Entry中包括了ThreadLocal實例和value), 導致Entry內(nèi)存泄漏也就是說: ThreadLocalMap中的key使用了強引用, 是無法完全避免內(nèi)存泄漏的。請結(jié)合圖1看。

3.3??那么為什么 key 要用弱引用

? ? ?事實上,在 ThreadLocalMap 中的set/getEntry 方法中,會對 key 為 null(也即是 ThreadLocal 為 null )進行判斷,如果為 null 的話,那么會把 value 置為 null 的.這就意味著使用threadLocal , CurrentThread 依然運行的前提下.就算忘記調(diào)用 remove 方法,弱引用比強引用可以多一層保障:弱引用的 ThreadLocal 會被回收.對應value在下一次 ThreadLocaI 調(diào)用 get()/set()/remove() 中的任一方法的時候會被清除,從而避免內(nèi)存泄漏.


?

3.4 如何正確的使用ThreadLocal

?1、將ThreadLocal變量定義成private static的,這樣的話ThreadLocal的生命周期就更長,由于一直存在ThreadLocal的強引用,所以ThreadLocal也就不會被回收,也就能保證任何時候都能根據(jù)ThreadLocal的弱引用訪問到Entry的value值,然后remove它,防止內(nèi)存泄露


?2、每次使用完ThreadLocal,都調(diào)用它的remove()方法,清除數(shù)據(jù)。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-786745.html

到了這里,關于史上最全ThreadLocal 詳解(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • (線程池)多線程使用場景--es數(shù)據(jù)批量導入、數(shù)據(jù)匯總、異步調(diào)用;如何控制某個方法允許并發(fā)訪問線程的數(shù)量;對ThreadLocal的理解及實現(xiàn)原理、源碼解析、ThreadLocal的內(nèi)存泄露問題

    (線程池)多線程使用場景--es數(shù)據(jù)批量導入、數(shù)據(jù)匯總、異步調(diào)用;如何控制某個方法允許并發(fā)訪問線程的數(shù)量;對ThreadLocal的理解及實現(xiàn)原理、源碼解析、ThreadLocal的內(nèi)存泄露問題

    CountDownLatch(閉鎖/倒計時鎖) 用來進行線程同步協(xié)作,等待所有線程完成倒計時(一個或者多個線程,等待其他多個線程完成某件事情之后才能執(zhí)行) 其中構(gòu)造參數(shù)用來初始化等待計數(shù)值 await() 用來等待計數(shù)歸零 countDown() 用來讓計數(shù) 減一 多線程使用場景一:( es數(shù)據(jù)批量導

    2024年04月25日
    瀏覽(47)
  • ThreadLocal 本地線程變量詳解

    ThreadLocal 本地線程變量詳解

    ThreadLocal 意為本地線程變量,即該變量只屬于當前線程,對其他線程隔離 我們知道,一個普通變量如果被多線程訪問會存在存在線程安全問題,這時我們可以使用 Synchronize 來保證該變量某一時刻只能有一個線程訪問,從而解決并發(fā)安全問題 但如果這個變量并不需要被共享,

    2024年02月05日
    瀏覽(20)
  • 【ThreadLocal詳解】

    【ThreadLocal詳解】

    ??ThreadLocal是一個用于實現(xiàn)線程數(shù)據(jù)隔離的一個類,每個線程訪問時,通過Get、Set方法都會產(chǎn)生一個屬于該線程的局部變量副本,當線程結(jié)束時,ThreadLocal及變量隨著線程一起被回收。 總的來說,ThreadLocal有三大用途: ??ThreadLocal雖然叫線程局部變量,但是它不存儲任何數(shù)據(jù)

    2024年02月12日
    瀏覽(20)
  • ThreadLocal 詳解

    ThreadLocal 詳解

    ThreadLocal類用來提供線程內(nèi)部的局部變量,不同的線程之間不會相互干擾 這種變量在多線程環(huán)境下訪問(通過get和set方法訪問)時能保證各個線程的變量相對獨立于其他線程內(nèi)的變量 在線程的生命周期內(nèi)起作用,可以減少同一個線程內(nèi)多個函數(shù)或組件之間一些公共變量傳遞的

    2023年04月08日
    瀏覽(9)
  • 導致JVM內(nèi)存泄露的ThreadLocal詳解

    導致JVM內(nèi)存泄露的ThreadLocal詳解

    很常見的關于ThreadLocal的面試題的問法: 1.說說你對ThreadLocal的理解。 2.ThreadLocal?是什么?有哪 些使用場景?什么是線程局部變量? 3.ThreadLocal內(nèi)存泄漏分析與解決方案。 ps:想理解好ThreadLocal,必須先得理解好JVM的內(nèi)存模型 多個線程共同操作一個共享變量,一定會引發(fā)并發(fā)問

    2024年02月09日
    瀏覽(28)
  • java ThreadLocal

    java ThreadLocal

    上面三行代碼分別是定義、賦值和取值。 介紹: 我們只需要實例化對象一次,并且也不需要知道它是被哪個線程實例化。雖然所有的線程都能訪問到這個ThreadLocal實例,但是每個線程卻只能訪問到自己通過調(diào)用ThreadLocal的set()方法設置的值。即使是兩個不同的線程在同一個T

    2024年02月14日
    瀏覽(15)
  • Java——》ThreadLocal

    Java——》ThreadLocal

    推薦鏈接: ????總結(jié)——》【Java】 ????總結(jié)——》【Mysql】 ????總結(jié)——》【Redis】 ????總結(jié)——》【Kafka】 ????總結(jié)——》【Spring】 ????總結(jié)——》【SpringBoot】 ????總結(jié)——》【MyBatis、MyBatis-Plus】 ????總結(jié)——》【Linux】 ????總結(jié)——》【MongoDB】 ???

    2024年02月09日
    瀏覽(15)
  • java面試之ThreadLocal問題

    java面試之ThreadLocal問題

    什么是ThreadLocal,它的基本用法是什么? 簡單來說就是能在多線程中保持變量獨立的線程對象 不用Threadlocal多線程訪問同一個變量會出現(xiàn)的問題 下面直接已經(jīng)線程混亂? ?一般來說我們可以用鎖來解決,比如引入synchronized,這里我們先不用鎖,我們用ThreadLocal這個類去解決 Thr

    2024年02月09日
    瀏覽(17)
  • java 淺談ThreadLocal底層源碼(通俗易懂)

    java 淺談ThreadLocal底層源碼(通俗易懂)

    目錄 一、ThreadLocal類基本介紹 ? ? ? ? 1.概述 :? ? ? ? ? 2.作用及特點 :? 二、ThreadLocal類源碼解讀 ? ? ? ? 1.代碼準備 :? ? ? ? ? ? ? 1.1 圖示? ? ? ? ? ? ? 1.2 數(shù)據(jù)對象 ? ? ? ? ? ? 1.3 測試類 ? ? ? ? ? ? 1.4 運行測試 ? ? ? ? 2.源碼分析 :? ? ? ? ? ? ? 2.1 set方法解讀

    2024年02月10日
    瀏覽(19)
  • 【Java】線程數(shù)據(jù)共享和安全 -ThreadLocal

    【Java】線程數(shù)據(jù)共享和安全 -ThreadLocal

    ???歡迎來到@邊境矢夢°的csdn博文?? ???本文主要梳理線程數(shù)據(jù)共享和安全 -ThreadLocal?? ??我是邊境矢夢°,一個正在為秋招和算法競賽做準備的學生?? ??喜歡的朋友可以關注一下 ?????? ,下次更新不迷路?? Ps: 月亮越亮說明知識點越重要 (重要性或者難度越大)????

    2024年02月09日
    瀏覽(43)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包