关于ThreadLocal和InheritableThreadLocal解析
一、两者区别
ThreadLocal:为每一个线程创建一个副本,每个副本线程隔离。但是他不支持继承。InheritableThreadLocal:支持继承。这里的继承不是extends,是指线程的继承。也就是说新起一个线程可以拥有老线程的数据。
二、原理
这里要先说另一个概念ThreadLocalMap。他和普通map差不多,也是key-value结构,key为threadlocal对象,value为你设置的值。
为什么这里要用map,因为可能有多个ThreadLocal对象。所以这个map可以理解为仓库,存储数据的仓库。
在Thread类我们可以看到如下分别创建2个 ThreadLocalMap对象。用来存储数据。

继续追踪,查找它是什么时候被赋值的(分为ThreadLocal实现和InheritableThreadLocal实现)。
ThreadLocal:在ThreadLocal类的set方法,它调用当前线程获取ThreadLocalMap,如果没有就new一个

InheritableThreadLocal:重写了getMap和createMap两个方法。

OK,我们知道是怎么赋值的,那么InheritableThreadLocal是怎么做到继承(值传递)的呢?
在Thread的init方法里我们看到如下的赋值语句:

在初始化时候获取当前线程的inheritableThreadLocals(这是新线程的初始化,但是currentThread获取的还是老线程),把它赋值到新线程的属性里去,这样新线程就有值了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringCloud应用idea实现可相互调用的多模块程序详解
IDEA 全称 IntelliJ IDEA,是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的2022-07-07
MapStruct内部错误:NullPointerException的解决方案
在Java开发中,MapStruct是一个非常流行的对象映射工具,它通过注解处理器在编译时生成映射代码,极大地简化了对象之间的转换操作,本文将详细分析一个常见的MapStruct内部错误——NullPointerException,并提供一系列解决方案,需要的朋友可以参考下2025-02-02
Spring加载配置和读取多个Properties文件的讲解
今天小编就为大家分享一篇关于Spring加载配置和读取多个Properties文件的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2019-03-03
Springboot多数据源配置之整合dynamic-datasource方式
这篇文章主要介绍了Springboot多数据源配置之整合dynamic-datasource方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-03-03


最新评论