最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的線程ThreadLocal詳細(xì)解析

 更新時間:2023年10月26日 09:04:32   作者:buzhbuzh  
這篇文章主要介紹了Java中的線程ThreadLocal詳細(xì)解析,ThreadLocal是線程本地變量,存儲在ThreadLocal里面的數(shù)據(jù)都是線程安全的,一般ThreadLocal適用的場景多是各個線程間沒有變量共享需要的同步問題場景,需要的朋友可以參考下

一 Java中的引用關(guān)系

Java中的引用分為了強(qiáng)引用、弱引用、軟引用、虛引用

  • 強(qiáng)引用: 垃圾回收的時候,如果內(nèi)存不足也不會進(jìn)行垃圾回收,會報out-of-memory異常
  • 弱引用: 垃圾回收的時候,如果內(nèi)存不夠,則數(shù)據(jù)被回收.
  • 軟引用: 垃圾回收的時候,軟引用會立刻進(jìn)行回收
  • 虛引用: 垃圾回收的時候,軟引用會立刻進(jìn)行回收

二 ThreadLocal代碼實(shí)現(xiàn)

ThreadLocal是線程本地變量,存儲在ThreadLocal里面的數(shù)據(jù)都是 線程安全的.

一般ThreadLocal適用的場景多是各個線程間沒有變量共享需要的同步問題場景,比如一個簡單的SimpleDateFormat類,該類不是線程安全的,卻是有狀態(tài)的,如果將SimpleDateFormat設(shè)置為靜態(tài)的,所有線程共享,那么就會出現(xiàn)線程安全的問題,其中一個線程修改日期格式為“yyyyMMdd”,然后可能會影響到另外一個需要格式為“yyyy-MM-dd”的線程。但是如果在方法中每次用到的時候都new一個SimpleDateFormat類又太費(fèi)內(nèi)存(SimpleDateFormat這種簡單的類倒還好,若是一些比較占用資源的比如數(shù)據(jù)庫連接類等,就會讓加大整個數(shù)據(jù)庫的壓力),這時候采用ThreadLocal為每一個線程保存一份SimpleDateFormat副本,這樣既不會說每次調(diào)用方法都會生成一個對象,也不會在并發(fā)時產(chǎn)生線程同步問題。這就像是在共享一個靜態(tài)變量和每次使用都new一個對象兩者之間的一種折中處理方法。

自己實(shí)現(xiàn)的ThreadLocal

在這里插入圖片描述

通過一個全局map, key是Thread對象,value是對應(yīng)存儲的數(shù)據(jù),這種情況下 如果map不銷毀,對應(yīng)的Thread線程就不發(fā)被回收,導(dǎo)致內(nèi)存泄露

JDK中使用的ThreadLocal

在這里插入圖片描述

JDK8中在Thread對象中引用ThreadLocalMap,ThreadLocalMap的生命周期是Thread是同一個生命周期.

ThreadLocalMap的實(shí)現(xiàn)

(1) Entry數(shù)組實(shí)現(xiàn)

在這里插入圖片描述

Entry數(shù)組是線程中實(shí)際存放數(shù)據(jù)的地方,key是ThreadLocal,是一個弱引用,value是對應(yīng)存儲的值.

為什么ThreadLocalMap#key是一個弱引用

如果外部不使用了ThreadLocal,則對應(yīng)的數(shù)據(jù)不應(yīng)該存儲在ThreadLocal中,應(yīng)該被刪除掉,防止內(nèi)存泄漏

ThreadLocalMap的屬性

        private static final int INITIAL_CAPACITY = 16;
    	//存儲數(shù)據(jù)的地方
        private Entry[] table; //
    	//數(shù)量
        private int size = 0;
        private int threshold; // Default to 0

ThreadLocal的方法

ThreadLocal#set()方法

在這里插數(shù)據(jù)入圖片描述

(1) 第一步 獲取到當(dāng)前線程的ThreadLocalMap

(2) 第二步 初始化ThreadLocalMap

(3) 第三步 將ThreadLocal作為key,value值作為值,設(shè)置到map中

ThreadLocal # get()方法

在這里插入圖片描述

方法主要完成兩個功能: (1) 完成數(shù)據(jù)的讀取 (2) 將ThreadLocalMap中key為NULL的數(shù)據(jù)從ThreadLocalMap中刪除

ThreadLocalMap中的entry其實(shí)是繼承的弱引用,如果該弱引用指向的ThreadLocal沒有在外部被強(qiáng)引用指向的話,在下次gc的時候就會被回收,那這樣的話就會出現(xiàn)ThreadLocalMap中存在key為null的情況,這樣的數(shù)據(jù)對于map來講是臟數(shù)據(jù),這樣的臟數(shù)據(jù)沒有用,卻一直占用著map的存儲空間,這其實(shí)就是一種內(nèi)存泄漏,所以需要來釋放掉這些空間

三 ThreadLocalMap的內(nèi)存泄漏問題

如果ThreadLocal無強(qiáng)引用進(jìn)行應(yīng)用,則在垃圾回收的時候會把這個key進(jìn)行回收.

這個時候,因?yàn)榫€程還存活,所以ThreadLocalMap依舊存在,但是key為null,這個 key對應(yīng)的value就無法被訪問到了,造成內(nèi)存泄漏.

JDK團(tuán)隊自己的解決辦法

調(diào)用get()、set()方法的時候,自動清理掉ThreadLocalMap中key為null的數(shù)據(jù)

開發(fā)者的解決辦法 使用ThreadLocal后,調(diào)用ThreadLocal

到此這篇關(guān)于Java中的線程ThreadLocal詳細(xì)解析的文章就介紹到這了,更多相關(guān)Java的ThreadLocal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java生成由時間組成的訂單號方式

    Java生成由時間組成的訂單號方式

    這篇文章主要介紹了Java生成由時間組成的訂單號方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 淺談java 中文件的讀取File、以及相對路徑的問題

    淺談java 中文件的讀取File、以及相對路徑的問題

    今天小編就為大家分享一篇淺談java 中文件的讀取File、以及相對路徑的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Eclipse中自動添加注釋(兩種)

    Eclipse中自動添加注釋(兩種)

    本文主要介紹了Eclipse中自動添加注釋的兩種方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Java Socket+多線程實(shí)現(xiàn)多人聊天室功能

    Java Socket+多線程實(shí)現(xiàn)多人聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Java Socket+多線程實(shí)現(xiàn)多人聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java中常見字符串拼接九種方式詳細(xì)例子

    Java中常見字符串拼接九種方式詳細(xì)例子

    這篇文章主要給大家介紹了關(guān)于Java中常見字符串拼接的九種方式,字符串拼接是我們在Java代碼中比較經(jīng)常要做的事情,就是把多個字符串拼接到一起,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 如何理解SpringMVC

    如何理解SpringMVC

    Spring Web MVC是一種基于Java的實(shí)現(xiàn)了Web MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進(jìn)行職責(zé)解耦,基于請求驅(qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā)
    2021-06-06
  • Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式

    Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式

    這篇文章主要為大家詳細(xì)介紹了Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Java 自定義錯誤類示例代碼

    Java 自定義錯誤類示例代碼

    以下是對Java中自定義錯誤類的示例代碼進(jìn)行了介紹。需要的朋友可以過來參考下
    2013-08-08
  • IDEA配置JavaFX全過程

    IDEA配置JavaFX全過程

    從Java11起,Java不再內(nèi)置JavaFX,在Java17項(xiàng)目中,需手動配置開發(fā)環(huán)境,添加JavaFX庫路徑,并設(shè)置運(yùn)行參數(shù)指向本地路徑
    2025-09-09
  • spring boot 異步線程池的使用詳解

    spring boot 異步線程池的使用詳解

    本文介紹了如何在SpringBoot項(xiàng)目中配置異步線程池,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-04-04

最新評論

六安市| 朔州市| 张家川| 宁晋县| 灵台县| 师宗县| 璧山县| 台南市| 色达县| 长治县| 潮安县| 讷河市| 栾川县| 教育| 开封县| 界首市| 文昌市| 昂仁县| 台北县| 宣武区| 桑植县| 托里县| 昔阳县| 博湖县| 石景山区| 涟水县| 搜索| 旅游| 黑水县| 铜川市| 清流县| 保亭| 宜兰县| 白玉县| 平顺县| 治多县| 元朗区| 无锡市| 怀化市| 山东| 焉耆|