Java線程中的ThreadLocal詳細(xì)分析
ThreadLocal簡介
ThreadLocal 提供線程的局部變量,每個(gè)線程都可以通過 get() 和 set() 對局部變量進(jìn)行操作而不會(huì)對其他線程的局部變量產(chǎn)生影響,實(shí)現(xiàn)了線程之間的數(shù)據(jù)隔離。
原理代碼
ThreadLocal<String> tl = new ThreadLocal<>();
new Thread(()->{
try {
tl.set("你好");
System.out.println(tl.get());
} finally {
tl.remove();
}
},"線程1").start();
new Thread(()->{
try {
tl.set("我好");
System.out.println(tl.get());
} finally {
tl.remove();
}
},"線程2").start();原理描述
- 每個(gè) Thread 維護(hù)著一個(gè) ThreadLocalMap 的引用
- ThreadLocalMap 是 ThreadLocal 的內(nèi)部類,用 Entry 來進(jìn)行存儲(chǔ)
- 調(diào)用 ThreadLocal 的 set() 方法時(shí),實(shí)際上就是往 ThreadLocalMap 設(shè)置值,key 是 ThreadLocal 對象,值是傳遞進(jìn)來的對象
- 調(diào)用 ThreadLocal 的 get() 方法時(shí),實(shí)際上就是往 ThreadLocalMap 獲取值,key 是 ThreadLocal 對象
- ThreadLocal 本身并不存儲(chǔ)值,它只是作為一個(gè) key 來讓線程從 ThreadLocalMap 獲取 value。
Thread 和 ThreadLocal 中 ThreadLocalMap 的數(shù)據(jù)結(jié)構(gòu)和關(guān)系

ThreadLocalMap 中的 Key 是弱引用,這是為什么?

當(dāng)引用 ThreadLocal 的方法結(jié)束的時(shí)候,此時(shí) threadLocal 對象不再被使用,此時(shí)應(yīng)該將 threadLocal 對象清除,假設(shè) key 引用 threadLocal 對象的時(shí)候時(shí)強(qiáng)引用,則該對象不會(huì)被清除,因此要采用弱引用。
ThreadLoca l中的內(nèi)存泄露問題,ThreadLocal 中最后為什么要加 remove 方法
- 正常情況下,我們線程結(jié)束之后,整個(gè)線程就會(huì)被銷毀,則 ThreadLocalMap 中的 Enty 也會(huì)被清除了
- 但是在使用線程池的情況下,線程會(huì)被復(fù)用,此時(shí) ThreadLocalMap 中的 Entry 不會(huì)被釋放,會(huì)存在這樣的 Entry:k:null value:222 這樣就會(huì)造成內(nèi)存泄露
- 所以每次都要調(diào)用remove 清除 key為 null 的Entry
到此這篇關(guān)于Java線程中的ThreadLocal詳細(xì)分析的文章就介紹到這了,更多相關(guān)Java的ThreadLocal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis實(shí)現(xiàn)關(guān)聯(lián)關(guān)系映射的方法示例
本文主要介紹了Mybatis實(shí)現(xiàn)關(guān)聯(lián)關(guān)系映射的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
SpringCloud版本問題報(bào)錯(cuò)及解決方法
這篇文章主要介紹了SpringCloud版本問題報(bào)錯(cuò)及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
SpringBoot集成內(nèi)存數(shù)據(jù)庫Sqlite的實(shí)踐
sqlite這樣的內(nèi)存數(shù)據(jù)庫,小巧可愛,做小型服務(wù)端演示程序,非常好用,本文主要介紹了SpringBoot集成Sqlite,具有一定的參考價(jià)值,感興趣的可以了解一下2021-09-09
java模擬TCP通信實(shí)現(xiàn)客戶端上傳文件到服務(wù)器端
這篇文章主要為大家詳細(xì)介紹了java模擬TCP通信實(shí)現(xiàn)客戶端上傳文件到服務(wù)器端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
java批量導(dǎo)入導(dǎo)出文件的實(shí)例分享(兼容xls,xlsx)
這篇文章主要給大家介紹了利用java批量導(dǎo)入導(dǎo)出文件的相關(guān)資料,文中給出了詳細(xì)的實(shí)例代碼,并且兼容xls,xlsx,對大家具有一定的參考學(xué)習(xí)價(jià)值,下面跟著小編一起來看看詳細(xì)的介紹吧。2017-06-06
Java 反射機(jī)制知識(shí)詳細(xì)介紹及總結(jié)
反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制2017-01-01
Java?Stream流常用方法實(shí)戰(zhàn)指南
Stream流是Java 8中的一個(gè)新特性,它提供了一種處理集合和數(shù)組的方式,Stream流可以讓我們以一種更加簡潔、高效、可讀性更強(qiáng)的方式來處理數(shù)據(jù),這篇文章主要介紹了Java?Stream流常用方法的相關(guān)資料,需要的朋友可以參考下2026-01-01

