關(guān)于ThreadLocal和InheritableThreadLocal解析
一、兩者區(qū)別
ThreadLocal:為每一個線程創(chuàng)建一個副本,每個副本線程隔離。但是他不支持繼承。InheritableThreadLocal:支持繼承。這里的繼承不是extends,是指線程的繼承。也就是說新起一個線程可以擁有老線程的數(shù)據(jù)。
二、原理
這里要先說另一個概念ThreadLocalMap。他和普通map差不多,也是key-value結(jié)構(gòu),key為threadlocal對象,value為你設置的值。
為什么這里要用map,因為可能有多個ThreadLocal對象。所以這個map可以理解為倉庫,存儲數(shù)據(jù)的倉庫。
在Thread類我們可以看到如下分別創(chuàng)建2個 ThreadLocalMap對象。用來存儲數(shù)據(jù)。

繼續(xù)追蹤,查找它是什么時候被賦值的(分為ThreadLocal實現(xiàn)和InheritableThreadLocal實現(xiàn))。
ThreadLocal:在ThreadLocal類的set方法,它調(diào)用當前線程獲取ThreadLocalMap,如果沒有就new一個

InheritableThreadLocal:重寫了getMap和createMap兩個方法。

OK,我們知道是怎么賦值的,那么InheritableThreadLocal是怎么做到繼承(值傳遞)的呢?
在Thread的init方法里我們看到如下的賦值語句:

在初始化時候獲取當前線程的inheritableThreadLocals(這是新線程的初始化,但是currentThread獲取的還是老線程),把它賦值到新線程的屬性里去,這樣新線程就有值了。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot+thymeleaf+shiro標簽的實例
這篇文章主要介紹了springboot+thymeleaf+shiro標簽的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring Boot 鉤子全集實戰(zhàn)EnvironmentPostProcessor全解
文章詳細介紹了SpringBoot中的EnvironmentPostProcessor擴展點,該點在配置加載階段提供強大的定制化能力,適用于配置中心化、加密解密、動態(tài)覆蓋和校驗等場景,感興趣的朋友跟隨小編一起看看吧2026-01-01
Java 中比較兩個 long 類型變量大小的方法(實例詳解)
比較兩個long類型變量的大小時,由于是基本數(shù)據(jù)類型,直接使用Java 內(nèi)置的關(guān)系運算符即可,這些運算符比較的是變量的實際值,而非內(nèi)存地址,下面給大家介紹Java中比較兩個long類型變量大小的方法,感興趣的朋友一起看看吧2025-06-06
關(guān)于批量插入或更新數(shù)據(jù)(MyBatis-plus框架)
這篇文章主要介紹了關(guān)于批量插入或更新數(shù)據(jù)(MyBatis-plus框架),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
java實戰(zhàn)小技巧之優(yōu)雅的實現(xiàn)字符串拼接
字符串拼接是我們在Java代碼中比較經(jīng)常要做的事情,就是把多個字符串拼接到一起,這篇文章主要給大家介紹了關(guān)于java實戰(zhàn)小技巧之優(yōu)雅的實現(xiàn)字符串拼接的相關(guān)資料,需要的朋友可以參考下2021-08-08

