關(guān)于ThreadLocal和InheritableThreadLocal解析
一、兩者區(qū)別
ThreadLocal
:為每一個(gè)線程創(chuàng)建一個(gè)副本,每個(gè)副本線程隔離。但是他不支持繼承。InheritableThreadLocal
:支持繼承。這里的繼承不是extends,是指線程的繼承。也就是說新起一個(gè)線程可以擁有老線程的數(shù)據(jù)。
二、原理
這里要先說另一個(gè)概念ThreadLocalMap。他和普通map差不多,也是key-value結(jié)構(gòu),key為threadlocal對(duì)象,value為你設(shè)置的值。
為什么這里要用map,因?yàn)榭赡苡卸鄠€(gè)ThreadLocal對(duì)象。所以這個(gè)map可以理解為倉庫,存儲(chǔ)數(shù)據(jù)的倉庫。
在Thread類我們可以看到如下分別創(chuàng)建2個(gè) ThreadLocalMap對(duì)象。用來存儲(chǔ)數(shù)據(jù)。
繼續(xù)追蹤,查找它是什么時(shí)候被賦值的(分為ThreadLocal實(shí)現(xiàn)和InheritableThreadLocal實(shí)現(xiàn))。
ThreadLocal
:在ThreadLocal類的set方法,它調(diào)用當(dāng)前線程獲取ThreadLocalMap,如果沒有就new一個(gè)
InheritableThreadLocal
:重寫了getMap和createMap兩個(gè)方法。
OK,我們知道是怎么賦值的,那么InheritableThreadLocal是怎么做到繼承(值傳遞)的呢?
在Thread的init方法里我們看到如下的賦值語句:
在初始化時(shí)候獲取當(dāng)前線程的inheritableThreadLocals(這是新線程的初始化,但是currentThread獲取的還是老線程),把它賦值到新線程的屬性里去,這樣新線程就有值了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Data?JPA映射自定義實(shí)體類操作
這篇文章主要介紹了Spring?Data?JPA映射自定義實(shí)體類操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11MyBatis啟動(dòng)時(shí)控制臺(tái)無限輸出日志的原因及解決辦法
這篇文章主要介紹了MyBatis啟動(dòng)時(shí)控制臺(tái)無限輸出日志的原因及解決辦法的相關(guān)資料,需要的朋友可以參考下2016-07-07SpringCloud應(yīng)用idea實(shí)現(xiàn)可相互調(diào)用的多模塊程序詳解
IDEA 全稱 IntelliJ IDEA,是java編程語言的集成開發(fā)環(huán)境。IntelliJ在業(yè)界被公認(rèn)為最好的Java開發(fā)工具,尤其在智能代碼助手、代碼自動(dòng)提示、重構(gòu)、JavaEE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創(chuàng)新的GUI設(shè)計(jì)等方面的功能可以說是超常的2022-07-07Java及數(shù)據(jù)庫對(duì)日期進(jìn)行格式化方式
這篇文章主要介紹了Java及數(shù)據(jù)庫對(duì)日期進(jìn)行格式化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03MapStruct內(nèi)部錯(cuò)誤:NullPointerException的解決方案
在Java開發(fā)中,MapStruct是一個(gè)非常流行的對(duì)象映射工具,它通過注解處理器在編譯時(shí)生成映射代碼,極大地簡(jiǎn)化了對(duì)象之間的轉(zhuǎn)換操作,本文將詳細(xì)分析一個(gè)常見的MapStruct內(nèi)部錯(cuò)誤——NullPointerException,并提供一系列解決方案,需要的朋友可以參考下2025-02-02教你怎么使用Java實(shí)現(xiàn)WebSocket
這篇文章主要介紹了教你怎么使用Java WebSocket,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05Spring加載配置和讀取多個(gè)Properties文件的講解
今天小編就為大家分享一篇關(guān)于Spring加載配置和讀取多個(gè)Properties文件的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式
這篇文章主要介紹了Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03