Java線程中的ThreadLocal詳細(xì)分析
ThreadLocal簡介
ThreadLocal 提供線程的局部變量,每個線程都可以通過 get() 和 set() 對局部變量進(jìn)行操作而不會對其他線程的局部變量產(chǎn)生影響,實現(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();
原理描述
- 每個 Thread 維護(hù)著一個 ThreadLocalMap 的引用
- ThreadLocalMap 是 ThreadLocal 的內(nèi)部類,用 Entry 來進(jìn)行存儲
- 調(diào)用 ThreadLocal 的 set() 方法時,實際上就是往 ThreadLocalMap 設(shè)置值,key 是 ThreadLocal 對象,值是傳遞進(jìn)來的對象
- 調(diào)用 ThreadLocal 的 get() 方法時,實際上就是往 ThreadLocalMap 獲取值,key 是 ThreadLocal 對象
- ThreadLocal 本身并不存儲值,它只是作為一個 key 來讓線程從 ThreadLocalMap 獲取 value。
Thread 和 ThreadLocal 中 ThreadLocalMap 的數(shù)據(jù)結(jié)構(gòu)和關(guān)系
ThreadLocalMap 中的 Key 是弱引用,這是為什么?
當(dāng)引用 ThreadLocal 的方法結(jié)束的時候,此時 threadLocal 對象不再被使用,此時應(yīng)該將 threadLocal 對象清除,假設(shè) key 引用 threadLocal 對象的時候時強(qiáng)引用,則該對象不會被清除,因此要采用弱引用。
ThreadLoca l中的內(nèi)存泄露問題,ThreadLocal 中最后為什么要加 remove 方法
- 正常情況下,我們線程結(jié)束之后,整個線程就會被銷毀,則 ThreadLocalMap 中的 Enty 也會被清除了
- 但是在使用線程池的情況下,線程會被復(fù)用,此時 ThreadLocalMap 中的 Entry 不會被釋放,會存在這樣的 Entry:k:null value:222 這樣就會造成內(nèi)存泄露
- 所以每次都要調(diào)用remove 清除 key為 null 的Entry
到此這篇關(guān)于Java線程中的ThreadLocal詳細(xì)分析的文章就介紹到這了,更多相關(guān)Java的ThreadLocal內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot日志收集及鏈路追蹤實現(xiàn)示例
這篇文章主要為大家介紹了Spring Boot日志收集及鏈路追蹤實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12關(guān)于FastJson?long?溢出問題的小結(jié)
這篇文章主要介紹了關(guān)于FastJson?long?溢出問題的小結(jié),具有很好的參考價值,希望對大家有所幫助。2022-01-01使用MockMvc進(jìn)行controller層單元測試 事務(wù)自動回滾的完整案例
這篇文章主要介紹了使用MockMvc進(jìn)行controller層單元測試 事務(wù)自動回滾的完整案例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java接口和抽象類實現(xiàn)抽象和多態(tài)的方法示例
接口和抽象類是 Java 中兩種實現(xiàn)抽象和多態(tài)的方法。它們之間有一些區(qū)別,但也有一些相似之處。這一節(jié)我們將通過詳細(xì)的例子來更深入地了解接口和抽象類2023-05-05基于常用json框架介紹和Jackson返回結(jié)果處理方式
這篇文章主要介紹了基于常用json框架介紹和Jackson返回結(jié)果處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java利用Sping框架編寫RPC遠(yuǎn)程過程調(diào)用服務(wù)的教程
這篇文章主要介紹了Java利用Sping框架編寫RPC遠(yuǎn)程過程調(diào)用服務(wù)的教程,包括項目管理工具M(jìn)aven的搭配使用方法,需要的朋友可以參考下2016-06-06