Java線程中的ThreadLocal詳細分析
更新時間:2023年09月26日 09:09:47 作者:西二旗C羅
這篇文章主要介紹了Java線程中的ThreadLocal詳細分析,ThreadLocal?提供線程的局部變量,每個線程都可以通過?get()和?set()對局部變量進行操作而不會對其他線程的局部變量產生影響,實現(xiàn)了線程之間的數據隔離,需要的朋友可以參考下
ThreadLocal簡介
ThreadLocal 提供線程的局部變量,每個線程都可以通過 get() 和 set() 對局部變量進行操作而不會對其他線程的局部變量產生影響,實現(xiàn)了線程之間的數據隔離。
原理代碼
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 維護著一個 ThreadLocalMap 的引用
- ThreadLocalMap 是 ThreadLocal 的內部類,用 Entry 來進行存儲
- 調用 ThreadLocal 的 set() 方法時,實際上就是往 ThreadLocalMap 設置值,key 是 ThreadLocal 對象,值是傳遞進來的對象
- 調用 ThreadLocal 的 get() 方法時,實際上就是往 ThreadLocalMap 獲取值,key 是 ThreadLocal 對象
- ThreadLocal 本身并不存儲值,它只是作為一個 key 來讓線程從 ThreadLocalMap 獲取 value。
Thread 和 ThreadLocal 中 ThreadLocalMap 的數據結構和關系

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

當引用 ThreadLocal 的方法結束的時候,此時 threadLocal 對象不再被使用,此時應該將 threadLocal 對象清除,假設 key 引用 threadLocal 對象的時候時強引用,則該對象不會被清除,因此要采用弱引用。
ThreadLoca l中的內存泄露問題,ThreadLocal 中最后為什么要加 remove 方法
- 正常情況下,我們線程結束之后,整個線程就會被銷毀,則 ThreadLocalMap 中的 Enty 也會被清除了
- 但是在使用線程池的情況下,線程會被復用,此時 ThreadLocalMap 中的 Entry 不會被釋放,會存在這樣的 Entry:k:null value:222 這樣就會造成內存泄露
- 所以每次都要調用remove 清除 key為 null 的Entry
到此這篇關于Java線程中的ThreadLocal詳細分析的文章就介紹到這了,更多相關Java的ThreadLocal內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mybatis實現(xiàn)關聯(lián)關系映射的方法示例
本文主要介紹了Mybatis實現(xiàn)關聯(lián)關系映射的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
java模擬TCP通信實現(xiàn)客戶端上傳文件到服務器端
這篇文章主要為大家詳細介紹了java模擬TCP通信實現(xiàn)客戶端上傳文件到服務器端,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10

