深度解析InheritableThreadLocal

InheritableThreadLocal深度解析:父子线程数据传递的奥秘 本文深入解析了InheritableThreadLocal的核心原理及其在父子线程数据传递中的应用。通过对比ThreadLocal,详细剖析了InheritableThreadLocal的遗传机制、线程安全特性及性能考量,并提供了电商场景、线程池集成等实战案例,帮助开发者高效解决多线程环境下的数据共享问题。 阅读详情

传统的ThreadLocal无法在子线程中传递数据,然而在实际业务中有些特殊场景需要再父子线程间实现数据的传递,对此就可以使用InheritableThreadLocal来实现。

简单使用

public class Test {
    public static void main(String[] args) {
        InheritableThreadLocal<String> threadLocal = new InheritableThreadLocal<>();
        threadLocal.set("Hello, world!");

        Thread thread = new Thread(() -> {
            String message = threadLocal.get();
            System.out.println(message); // 输出 "Hello, world!"
        });

        thread.start();
    }
}

原理解析

InheritableThreadLocal继承了ThreadLocal类,当我们在初始化InheritableThreadLocal的时候调用set方法设置数据,其实调用的是ThreadLocal类的set的方法,getMap(t)等于null,调用InheritableThreadLocal的creactMap方法给线程的inheritableThreadLocals进行赋值,然后在创建子线程的时候调用Thread类的init方法,该方法类获取父线程的inheritableThreadLocals不为空后给当前子线程的inheritableThreadLocals赋值父线程的数据,从而实现父子线程的数据传递。

public class ThreadLocal<T> {
    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            map.set(this, value);
        } else {
            createMap(t, value);
        }
    }
}
public class InheritableThreadLocal<T> extends ThreadLocal<T> {
    protected T childValue(T parentValue) {
        return parentValue;
    }

    ThreadLocalMap getMap(Thread t) {
       return t.inheritableThreadLocals;
    }

    void createMap(Thread t, T firstValue) {
        t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
    }
}

public class Thread implements Runnable {
    ThreadLocal.ThreadLocalMap threadLocals = null;

    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
    // 创建线程时调用线程的无参构造函数
    public Thread() {
        init(null, null, "Thread-" + nextThreadNum(), 0);
    }
    
    private void init(ThreadGroup g, Runnable target, String name, long stackSize) {
        init(g, target, name, stackSize, null, true);
    }
    
    private void init(ThreadGroup g, Runnable target, String name,
                  long stackSize, AccessControlContext acc,
                  boolean inheritThreadLocals) {
        if (name == null) {
            throw new NullPointerException("name cannot be null");
        }
    
        this.name = name;
    
        Thread parent = currentThread();
        SecurityManager security = System.getSecurityManager();
        if (g == null) {
            if (security != null) {
                g = security.getThreadGroup();
            }
            if (g == null) {
                g = parent.getThreadGroup();
            }
        }
        g.checkAccess();
    
        if (security != null) {
            if (isCCLOverridden(getClass())) {
                security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
            }
        }
    
        g.addUnstarted();
    
        this.group = g;
        this.daemon = parent.isDaemon();
        this.priority = parent.getPriority();
        if (security == null || isCCLOverridden(parent.getClass()))
            this.contextClassLoader = parent.getContextClassLoader();
        else
            this.contextClassLoader = parent.contextClassLoader;
        this.inheritedAccessControlContext =
                acc != null ? acc : AccessController.getContext();
        this.target = target;
        setPriority(priority);
        if (inheritThreadLocals && parent.inheritableThreadLocals != null)
            this.inheritableThreadLocals =
                ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
        this.stackSize = stackSize;
    
        tid = nextThreadID();
    }
}

51单片机IAP技术详解:从原理到实战,实现远程程序自更新 在嵌入式系统开发中,程序更新是产品维护和功能迭代的核心需求。传统方式依赖外部烧录器,操作繁琐且无法远程进行。IAP(在应用中编程)技术则从原理层面解决了这一难题,它允许单片机在运行过程中通过特定接口(如串口)动态修改自身的Flash程序存储器。这项技术的核心价值在于赋予设备远程升级和自主维护的能力,极大地延长了产品生命周期并降低了维护成本。其典型应用场景包括智能家居控制器、工业数据采集模块和远程仪表等部署后不便拆卸的设备。本文以经典的51单片机(如STC89C52)为例,深入剖析IAP的实现,其中Bootl 阅读详情

相关推荐

CVPR 2027 投稿规划:基于近3年录用率与截稿周期的5步时间管理法

本文为计算机视觉研究者提供CVPR 2027投稿的完整规划指南,基于近三年录用率与截稿周期数据,提出五步时间管理法。涵盖选题策略、实验设计、论文写作、同行评审到最终提交的全流程优化,特别针对CVPR日益激烈的竞争环境(2024年投稿量达11532篇,录取率仅23.6%)提供实用解决方案,帮助研究者提升投稿成功率。

weixin_34079177的博客 1169

InheritableThreadLocal详解

本文内容:InheritableThreadLocal可以做什么InheritableThreadLocal使用实例InheritableThreadLocal原理Inheritable...

LifeIsGood 1万+

Win系统蓝牙设备频繁卡顿/断连 - 解决方案

无线网卡有2个模块,一个是WiFi,一个是蓝牙,因此蓝牙问题可能和无线网卡有关。在某些情况下,例如高温或WiFi速率过高,会导致蓝牙频繁卡顿/断连。解决方法分为2种,1是更新驱动,2是更换无线网卡。

NSJim的博客 2万+

Java多线程--InheritableThreadLocal的用法(有实例)

本文介绍InheritableThreadLocal的用法。 ThreadLocal可以将数据绑定当前线程,如果希望当前线程的ThreadLocal的数据被子线程使用,实现方式就会相当困难(需要用户自己在代码中传递)。 InheritableThreadLocal可以方便地让子线程自动获取父线程ThreadLocal的数据。......

IT利刃出鞘的博客 2795

保姆级教程:用STM8S207R6和FD6288T自制BLDC驱动板,从原理图到代码框架搭建

本文提供了一份详细的STM8S207R6和FD6288T自制BLDC驱动板教程,涵盖从原理图设计到代码框架搭建的全过程。通过硬件选型、电源电路设计、PWM定时器配置等关键步骤解析,帮助开发者快速掌握无刷直流电机驱动技术,实现高效稳定的电机控制方案。

weixin_28729205的博客 489

大数据运维面试题及答案

1. 架构组成:- 2 个 NameNode(Active 活跃节点、Standby 备用节点),实时同步元数据(通过 JournalNode 集群,默认 3 个节点,存储 edits 日志,Active 写入、Standby 读取以保持元数据一致);- 容错性强:通过 RDD 的 “ lineage(血缘)” 机制,任务失败时可快速重算,无需从头执行。:集群 “大脑”,管理元数据(文件目录、块位置),实时响应客户端请求,数据存于内存,元数据镜像(fsimage)和编辑日志(edits)持久化到磁盘;

weixin_42795092的博客 908

InheritableThreadLocal使用详解

InheritableThreadLocal详解

坚定目标,超越自我 5934

视网膜血管分割数据集(DRIVE数据集,STARE数据集,REFUGE数据集,CHASE_DB1数据集,DiaRetDB1数据集)

在医学图像处理领域,视网膜图像分析对于眼部疾病的早期诊断与治疗具有举足轻重的意义。随着人工智能技术的蓬勃发展,尤其是深度学习算法在图像分割任务中的广泛应用,高质量的视网膜图像数据集成为推动该领域研究进展的关键要素。这些数据集不仅是训练和优化算法模型的基石,更是衡量算法性能优劣的重要依据。本文聚焦于视网膜图像分割领域,详细介绍 DRIVE、STARE、REFUGE、CHASE_DB1 以及 DiaRetDB1 这几个具有代表性的数据集。

weixin_43518285的博客 2272

InheritableThreadLocal使用示例

ThreadLocal存储线程安全变量,InheritableThreadLocal是ThreadLocal的低配版,因为它可以get到在父线程set的变量。见如下示例: public class TestThreadLocal { static final String VALUE01 = "VALUE01"; static final String VALUE02 = "...

welcome to daijiguo's blog 1971

使用 Simulink + Simscape Electrical 搭建一个三相PWM整流器模型

本文详细介绍了使用Simulink搭建三相PWM整流器模型的方法,重点讲解了SVPWM调制策略的实现过程。内容包括系统结构设计、主电路搭建、SVPWM算法实现、双闭环控制器设计以及仿真分析。通过MATLAB Function Block实现SVPWM核心算法,并给出优化建议,如死区补偿、开关频率优化等。该教程为电力电子领域工程师提供了实用的建模与仿真方法,可用于新能源并网、电机驱动等应用场景的研发与优化。

amy_mhd的博客 200

vue2学习笔记2-老规矩,从Hello World开始,了解Vue实例和模板

想要把“Hello,World”放置在页面上,首先需要准备一个HTML的块级元素div,来承接内容。

l_q_l的专栏 1259

InheritableThreadLocal使用

从名字上可以看出InheritableThreadLocal就是用来解决父子线程继承时使用的问题,其实大致都可以猜到,我们先来看看例子: public class InheritableThreadLocalT { public static final ThreadLocal&lt;String&gt; threadLocal = new ThreadLocal&lt;&gt;();...

诗人不写诗 2575

MIKE水动力笔记17_MIKE文件转shp、统计每个单元格的面积

MIKE的工具箱中自带一个转shp的工具,然后可以拖进ArcGIS中很方便的统计每个单元格的面积和每个网格点的水深。

晏长街的博客 4153

ThreadLocal、InheritableThreadLocal与TransmittableThreadLocal深度解析

本文比较了ThreadLocal、InheritableThreadLocal和TransmittableThreadLocal三种线程局部变量实现。ThreadLocal提供线程隔离变量,InheritableThreadLocal支持父子线程变量继承,TransmittableThreadLocal则进一步支持异步任务变量传递。文章详细分析了各自的使用场景、优缺点及典型代码示例,并给出选型建议。

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1485

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

InheritableThreadLocal 何时继承?从线程创建到线程池上下文的三个实验

创建子线程时继承的值,为什么在线程池任务里仍然过时?用三个Java实验区分创建、提交、残留与退出恢复,并验证可变对象是否真正被复制。

冷脸萌萌的技术实践 1180

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

InheritableThreadLocal深度解析:父线程修改后子线程能看到新值吗?

✅ 子线程在创建时复制父线程的值❌ 父线程之后修改不会影响已创建的子线程🔄 如果需要动态传递值,需要考虑其他通信机制(如队列、共享变量等)场景推荐方案注意事项简单上下文传递避免线程池复用高频动态更新AtomicReference包装注意并发控制企业级应用需引入第三方库全新项目未来趋势值传递时机:仅在创建子线程时复制一次不可变性:适合传递不可变对象(String、Integer等)清理资源:finally块中必须remove()线程池慎用:考虑使用TTL等增强方案。

全栈开发工程师 637

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ThreadLocal深度解析:从线程本地存储到分布式链路追踪的上下文传递机制

ThreadLocal(TL)是Java中一种上下文保存机制,可以在同一个线程内进行数据传递,不少java开发者对ThreadLocal望而生畏,担心Threadlocal使用不当会产生意想不到的内存问题。本文结合着几个问题,深度剖析Threadlocal的设计原理,解析它产生内存泄漏的根本原因,如何避免和解决这些问题,最后引入ITL和TTL帮助大家深刻掌握和使用ThreadLocal。

odamangguo的博客 985

ThreadLocal的原理剖析和使用场景

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!*/public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}/**Returns the value in the current thread’s copy o

D1561691的博客 1045

最安全的线程上下文传递方案:TransmittableThreadLocal防泄漏设计全解析

TransmittableThreadLocal(TTL)是Java开发中解决线程上下文传递的终极方案,它提供了增强版的InheritableThreadLocal,即使在线程池环境下也能安全传递值,从根本上避免了传统ThreadLocal的内存泄漏风险。本文将深入解析TTL的防泄漏设计原理,帮助开发者彻底掌握这一框架/中间件必备的线程上下文传递工具。 ## 🔍 线程上下文传递的隐形陷阱 在

gitblog_00481的博客 702

ThreadLocal 的边界:线程池残留、继承时机与虚拟线程

用JDK21单线程池、继承时机和虚拟线程实验,区分ThreadLocal的引用关联、任务残留与上下文传播,并限定弱Key清理和载体调度的结论。

冷脸萌萌的技术实践 1079

ThreadLocal被问出了花?一篇彻底搞懂它的终极指南

ThreadLocal被问出了花?一篇彻底搞懂它的终极指南

IT枫斗者的博客 1014

InheritableThreadLocal-详解

InheritableThreadLocal是ThreadLocal的子类,允许子线程继承父线程的变量值。它在newThread()时复制父线程数据到子线程,之后各自独立。主要应用于需要跨线程传递上下文(如TraceID、用户会话)的场景,但不适用于线程池(会导致数据污染)。注意:继承是单向的、仅在创建时发生,使用后需remove()避免内存泄漏。线程池场景应改用TransmittableThreadLocal(TTL)。

M_Reus_11的博客 970

ThreadLocal、InheritableThreadLocal 与 TransmittableThreadLocal 的深度探究

在当今的 Java 多线程编程领域,ThreadLocal 及其相关的扩展 InheritableThreadLocal 和 TransmittableThreadLocal 宛如三把利剑,为我们在处理线程本地数据时提供了强大而灵活的工具。深入理解它们各自的特点、差异以及适用场景,对于我们编写出高效、可靠且稳定的多线程代码具有至关重要的意义。在接下来的篇幅中,让我们一同深入探讨这三个类的奥秘,通过详尽的代码片段和深入的原理解析,助您全面掌握它们在实际应用中的精髓。

持续分享有趣的技术干货 1393

InheritableThreadLocal详解:父子线程数据传递的桥梁

是的一个子类,它额外提供了子线程继承父线程线程局部变量的能力。// 子类重写的方法,用于定义子线程初始值特性线程隔离✅ 完全隔离✅ 完全隔离子线程继承❌ 不支持✅ 支持(创建时)底层存储默认拷贝方式浅拷贝线程池支持✅ 没问题⚠️ 有陷阱内存泄漏风险⚠️ 需要remove⚠️ 需要remove适用场景线程内全局变量父子线程传递上下文fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3270

并发编程模式 - InheritableThreadLocal源码解析

很多时候需要在父子线程中传递值,或者引用相同的参数,则可以使用InheritableThreadLocal进程处理。在理解完上一篇ThreadLocal之后,再看看InheritableThreadLocal的源码,比较简单: public class InheritableThreadLocal<T> extends ThreadLocal<T> { public InheritableThreadLocal() { } protecte...

it_lihongmin的博客 324

深入解析InheritableThreadLocal:父子线程间的数据传递机制

本文深入解析了InheritableThreadLocal在父子线程间数据传递的机制,对比了其与ThreadLocal的关键区别,并提供了实际应用场景和解决方案。特别探讨了在线程池环境下InheritableThreadLocal的失效问题及阿里开源的TransmittableThreadLocal解决方案,帮助开发者更好地在多线程环境中管理上下文数据。

w7x8y9z的博客 421
上一篇: 记录一个mybatis-plus的批量修改的问题
下一篇: AWS云服务自建redis服务
HuangSl_java
博客等级 码龄9年 11粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值