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

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

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

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

在初始化時候獲取當(dāng)前線程的inheritableThreadLocals(這是新線程的初始化,但是currentThread獲取的還是老線程),把它賦值到新線程的屬性里去,這樣新線程就有值了。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud應(yīng)用idea實現(xiàn)可相互調(diào)用的多模塊程序詳解
IDEA 全稱 IntelliJ IDEA,是java編程語言的集成開發(fā)環(huán)境。IntelliJ在業(yè)界被公認(rèn)為最好的Java開發(fā)工具,尤其在智能代碼助手、代碼自動提示、重構(gòu)、JavaEE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創(chuàng)新的GUI設(shè)計等方面的功能可以說是超常的2022-07-07
MapStruct內(nèi)部錯誤:NullPointerException的解決方案
在Java開發(fā)中,MapStruct是一個非常流行的對象映射工具,它通過注解處理器在編譯時生成映射代碼,極大地簡化了對象之間的轉(zhuǎn)換操作,本文將詳細(xì)分析一個常見的MapStruct內(nèi)部錯誤——NullPointerException,并提供一系列解決方案,需要的朋友可以參考下2025-02-02
Spring加載配置和讀取多個Properties文件的講解
今天小編就為大家分享一篇關(guān)于Spring加載配置和讀取多個Properties文件的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式
這篇文章主要介紹了Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

