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

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

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

JDK中使用的ThreadLocal

在這里插入圖片描述

JDK8中在Thread對(duì)象中引用ThreadLocalMap,ThreadLocalMap的生命周期是Thread是同一個(gè)生命周期.

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

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

在這里插入圖片描述

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

為什么ThreadLocalMap#key是一個(gè)弱引用

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

ThreadLocalMap的屬性

        private static final int INITIAL_CAPACITY = 16;
    	//存儲(chǔ)數(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()方法

在這里插入圖片描述

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • Java生成由時(shí)間組成的訂單號(hào)方式

    Java生成由時(shí)間組成的訂單號(hào)方式

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

    淺談java 中文件的讀取File、以及相對(duì)路徑的問(wèn)題

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

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

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

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

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

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

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

    如何理解SpringMVC

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

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

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

    Java 自定義錯(cuò)誤類示例代碼

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

    IDEA配置JavaFX全過(guò)程

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

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

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

最新評(píng)論

仲巴县| 娄底市| 浮山县| 新绛县| 香格里拉县| 金塔县| 武胜县| 鹿泉市| 梁山县| 阜宁县| 松阳县| 彭州市| 广平县| 张家界市| 东城区| 林甸县| 镇安县| 青河县| 洛浦县| 林西县| 靖州| 自贡市| 威远县| 亳州市| 五原县| 阿鲁科尔沁旗| 南城县| 开远市| 卫辉市| 呈贡县| 岳普湖县| 广丰县| 博乐市| 克什克腾旗| 阿鲁科尔沁旗| 博客| 双辽市| 驻马店市| 循化| 南通市| 磐安县|