ThreadLocal、InheritableThreadLocal、transmittablethreadlocal简单记录

基于ThreadLocal、InheritableThreadLocal与TransmittableThreadLocal技术解析,线程间数据共享在投行风控与交易系统中的应用实战 正确使用这些技术,既能保障数据安全,又能提升系统性能。尤其在金融级系统中,可靠性与性能的平衡是架构设计的核心关注点。 阅读详情

ThreadLocal

ThreadLocal用于保存线程线程本地变量,访问这个变量的每个线程都会有这个变量的一个本地副本,多个线程同时对这个变量进行读写操时,实际上操作的是线程自己本地内存中的变量,从而避免了线程安全的问题。

比如多个方法都用到某个参数,为了避免一直传递,可以放到ThreadLocal中。

//    threadLocal :主线程的threadLocal不会往子线程复制的,只是保留了一个空副本
    public static  final ThreadLocal<Map<String,Object>> threadLocal = new ThreadLocal<>();
    static {
        Map<String, Object> map = new ConcurrentHashMap<>();
        map.put("cnt",0);
        threadLocal.set(map);
    }
    public static void main(String[] args) {
        System.out.println(threadLocal.get().get("cnt"));
        CountDownLatch countDownLatch = new CountDownLatch(9);
        for (int i = 1;i<10;i++){
            int finalI = i;
            try {
                new Thread(new Runnable() {
                    public void run() {
                        //threadLocal 线程隔离这里会报空指针异常,所以一般我们都会做一个get方法,如果是空则付一下默认值
                        System.out.println(threadLocal.get().get("cnt"));
                    }
                }).start();

            }catch   (Exception e) {
                throw new RuntimeException("111");
            } finally {
                countDownLatch.countDown();
            }
        }
        try {
            countDownLatch.await(); //保证之前的所有的线程都执行完成,才会走下面的;
        } catch (Exception e) {
            throw new RuntimeException();
        }

    }

InheritableThreadLocal

能够使让子线程访问到父线程中设置的本地变量的值

//    InheritableThreadLocal 可以向子线程传递,这个复制是引用复制,即子线程的修改会反馈到主线程
    public static  final InheritableThreadLocal<Map<String,Object>> threadLocal = new InheritableThreadLocal<>();
    static {
        Map<String, Object> map = new ConcurrentHashMap<>();
        map.put("cnt",0);
        threadLocal.set(map);
    }
    public static void main(String[] args) throws InterruptedException {
        System.out.println("最初:"+threadLocal.get().get("cnt"));
        CountDownLatch countDownLatch = new CountDownLatch(9);
        for (int i = 1;i<10;i++){
            int finalI = i;
                if (i==7){
                    Thread.sleep(i*100);
                }
                new Thread(new Runnable() {
                    public void run() {
                        try {
                            Map<String, Object> subMap = threadLocal.get();
                            System.out.println(Thread.currentThread().getName()+"加之前:"+threadLocal.get().get("cnt"));
                            subMap.put("cnt",Integer.parseInt(subMap.get("cnt").toString())+finalI);
                            threadLocal.set(subMap);
                            System.out.println(Thread.currentThread().getName()+"加之后:"+threadLocal.get().get("cnt"));
                        }catch   (Exception e) {
                            throw new RuntimeException("111");
                        } finally {
                            countDownLatch.countDown();
                        }
                    }
                }).start();

        }
        try {
            countDownLatch.await(); //保证之前的所有的线程都执行完成,才会走下面的;
        } catch (Exception e) {
            throw new RuntimeException();
        }
        System.out.println("最终:"+threadLocal.get().get("cnt"));
    }

InheritableThreadLocal可以保证子线程获得主线程的变量,其实是在线程创建的时候从主线程中对线程变量做了一个地址引用,所以说在子线程结束之后,主线程的线程变量也改变了。

这里需要考虑下,如果使用得当线程池,核心线程创建之后是不会销毁的,所以此变量就一直保留了下来。

阿里的transmittablethreadlocal  可以解决InheritableThreadLocal 和线程池搭配,核心线程不销毁,导致的InheritableThreadLocal 错乱问题。

TransmittableThreadLocal详解_邋遢的流浪剑客的博客-优快云博客_transmittable-thread-local这个老哥写的挺详细的。

海康门禁二次开发实战:用Java实现员工考勤系统的人脸权限管理 本文详细介绍了如何利用Java技术栈进行海康威视门禁系统的二次开发,实现员工考勤系统的人脸权限管理。从开发环境准备、SDK集成到设备连接、人脸数据批量处理,再到权限管理与异常处理,全面解析了海康门禁对接开发的关键步骤和最佳实践,助力企业构建高效、安全的智能考勤系统。 阅读详情

相关推荐

几款支持国标GB28181的平台以及视频监控设备接入的配置方法(Web端无插件播放)

GB28181解决的一个主要问题就是如何远程、跨网络、跨区域、跨级别的访问网络中的监控设备(包括IPC、NVR等),本文介绍几款G28181平台的接入配置方法,适合有监控视频摄像头的远程接入和预览需求的人群参考使用。

一名高级工程师的博客 1万+

TransmittableThreadLocal使用与详解

TransmittableThreadLocal 是 Alibaba 开源的一个库,旨在解决在多线程环境中正确处理的问题。它提供了一个能够在线程间传递 ThreadLocal 值的特性。

qq_41999771的博客 5005

Procedural modeling

What is procedural modeling? One content generation option is modeling buildings, plants, clouds, cities, and worlds using an underlying system of rules. 1 Procedural Modeling: Grammars A rule-based generative system loosely organized as: ...

qq_24505417的博客 711

使用ThreadLocal和InheritableThreadLocal存储和传递线程专用变量

记录:389 场景:使用InheritableThreadLocal和ThreadLocal,实现一个变量var,在线程A执行的多个环节中传递变量var。比如从HttpServletRequest的请求头获取的token值存放到ThreadLocal,那么在Controller层、Service层、Dao层以及相关环节中均可以从ThreadLocal获取token值。

zhangbeizhen18的博客 708

Linux USB设备命名规则

有一个USB设备,接到了Linux系统的终端的某个插口上,那么怎么找到这个设备对应设备路径呢?这个USB设备虚拟了多个功能(三个串口和一个网卡), 如何找到对应操作路径呢?

weixin_43132521的博客 1699

WorkBuddy 实战:从聊天窗口到 AI 工作台,打造个人自动化助理

大模型时代,对话式 AI 常被当作高级搜索框,难以沉淀为生产力。其根源在于上下文断裂——每次对话都从零开始。AI Agent 的核心原理是通过状态保持、工具调用与流程复用,将临时交互固化为可重复的协作机制。WorkBuddy 作为个人 AI 工作台,以 Agent + Skill + 工作流架构解决该问题:Skill 封装操作手册,工作区沉淀知识上下文,自定义指令约束输出风格。这种设计让周报生成、会议纪要、文档初稿、专利检索辅助等重复劳动实现流程化自动产出。掌握 WorkBuddy 怎么用,关键在于从自己重

weixin_33834910的博客 335

InheritableThreadLocal原理解析

package com.cjian.threadlocal; import java.util.Collections; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** * @description: * @author: CJ * @time: 2021/5/13 14:00 */ public class ThreadLocalUtils { private static f.

cj_eryue的博客 419

从SPI到JTAG:玩转FT2232H的MPSSE多协议切换指南(附配置代码)

本文详细介绍了如何利用FT2232H芯片的MPSSE技术实现SPI与JTAG协议的无缝切换,提供配置代码和调试技巧。通过解析MPSSE引擎架构和硬件特性,帮助开发者灵活应对多种串行协议需求,提升嵌入式开发效率。特别适合FPGA调试和物联网设备开发场景。

sun99的博客 254

InheritableThreadLocal和TransmittableThreadLocal详解

InheritableThreadLocal 简介 由于ThreadLocal设计之初就是为了绑定当前线程,如果希望当前线程的ThreadLocal能够被子线程使用,实现方式就会相当困难(需要用户自己在代码中传递)。在此背景下,InheritableThreadLocal应运而生。 应用 调用链追踪:在调用链系统设计中,为了优化系统运行速度,会使用多线程编程,为了保证调用链ID能够自然的在多线程间传递,需要考虑ThreadLocal传递问题(大多数系统会使用线程池技术,这已经不仅仅是InheritableT

花明的博客 2339

简要介绍 | 雷达穿墙成像及其应用场景

本文简要介绍了雷达穿墙成像技术的原理、研究现状、挑战与未来展望,希望能为相关领域的研究与应用提供参考。具有广泛的应用前景。本文将详细介绍雷达穿墙成像的原理,以及其在不同应用场景中的实践。逆时偏移算法(Reverse-Time Migration, RTM)雷达穿墙成像技术是一种先进的遥感技术,具有。的能力,可用于探测室内目标。安全与救援、建筑结构检测等领域。雷达穿墙成像技术的核心原理是。是Green函数,表示从接收点。雷达穿墙成像及其应用场景。雷达穿墙成像及其应用场景。目标识别与定位准确性。

NLOS的博客 2233

在 SAP BTP ABAP 环境里直连 ABAP On-Premise OData

摘要 SAP BTP ABAP Environment 2311版本后,OData集成链路迎来重大改进:Service Consumption Model升级为v2版本,通过压缩模型到单一类减少对象数量;通信管理推荐采用Communication Arrangement替代传统Destination,提供更清晰的治理边界。新版支持同时生成OData v2/v4消费模型,并通过标准工厂类创建代理。配置需关注四层对象:Outbound Service声明协议入口,Scenario定义认证方式,System描述通

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1920

InheritableThreadLocal和TransmittableThreadLocal

InheritableThreadLocal和TransmittableThreadLocal

hbqst的博客 416

裂缝二维检测:裂缝的长度和宽度检测

这一节,我们需要去整合一下前面的代码,在进行长度和宽度的测量时,需要裂缝的类型、个数、面积的帮助。这一章是本专栏的核心部分。以上代码我均试过,由于本人能力有限,看不懂代码,最终还是没有采用,使用的是最普通检测宽度的方法,即求得骨架总长度后,用总面积求取平均宽度。

m0_62919535的博客 4241

ThreadLocal、InheritableThreadLocal 与 TransmittableThreadLocal 深度对比

在 Java 并发编程中,线程局部变量(ThreadLocal)是我们处理线程隔离数据的常用工具。然而,随着业务场景复杂化,特别是微服务、异步编程和线程池的广泛使用,原生 ThreadLocal 的局限性逐渐暴露出来。本文将深入剖析 ThreadLocal、InheritableThreadLocal 和 TransmittableThreadLocal 三者的核心原理、优缺点及适用场景,帮助你做出正确的技术选型。

uybji的博客 464

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ThreadLocal与InheritableThreadLocal

ThreadLocal与InheritableThreadLocal

正在努力的小小小白 994

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal、FastThreadLocal对比分析

ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal、FastThreadLocal对比分析

ronshi的博客 822

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

阿里开源TransmittableThreadLocal使用经验记录

本文章主要记录我在一次业务优化中,使用线程池带来的子父线程值传递问题,及使用TransmittableThreadLocal来解决该问题的经验,并对TransmittableThreadLocal原理做些梳理。

天天都在进步的博客 3084

ThreadLocal,InheritableThreadLocal,TTL全解

ThreadLocal,InheritableThreadLocal,TTL全解 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录ThreadLocal,InheritableThreadLocal,TTL全解前言T一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: T 提示:以下是本篇文章

天行健的专栏 1078

有了InheritableThreadLocal为啥还需要TransmittableThreadLocal?

典型回答InheritableThreadLocal是用于主子线程之间参数传递的,但是,这种方式有一个问题,那就是必须要是在主线程中手动创建的子线程才可以,而现在池化技术非常普遍了,很多时候线程都是通过线程池进行创建和复用的,这时候InheritableThreadLocal就不行了。TransmittableThreadLocal是阿里开源的一个方案 () ,这个类继承并加强InheritableThreadLocal类。

Quasimodo24的博客 474

ThreadLocal和InheritableThreadLocal的使用以及区别

记录一下ThreadLocal和InheritableThreadLocal的差别以及用法。已知这两个类都是做线程本地缓存的。

qq_52148082的博客 475

ThreadLocal、InheritableThreadLocal、TransmisttableThreadLocal使用记录以及源码解析

一、ThreadLocal ThreadLocal是JDK自带的工具类,主要是为了我们方便我们在同一个线程中进行变量的共享。 public class ThreadLocalUtils { public static ThreadLocal<String> THREAD_LOCAL = new ThreadLocal<>(); } public class ThreadLocalGetTest { public void testGet(){

scryihao的博客 355

【并发编程】InheritableThreadLocal的使用与原理

​​特性​​作用范围仅当前线程当前线程 + 子线程子线程是否继承❌✅适用场景线程隔离数据跨线程传递上下文线程池兼容性无问题需额外处理(线程复用导致失效)​​最佳实践​​:对于需要跨父子线程传递数据的场景(非线程池),使用;若涉及线程池,优先考虑。

我是Superman丶的博客 552

TransmittableThreadLocal详解

1、简介 TransmittableThreadLocal 是Alibaba开源的、用于解决 “在使用线程池等会缓存线程的组件情况下传递ThreadLocal” 问题的 InheritableThreadLocal 扩展。若希望 TransmittableThreadLocal 在线程池与主线程间传递,需配合 TtlRunnable 和 TtlCallable 使用。 2、使用场景 下面是几个典型场景例子。 分布式跟踪系统 应用容器或上层框架跨应用代码给下层SDK传递信息 日志收集记录系统上下文 3、源

Mr1ght的博客 2万+

【JUC进阶】14. TransmittableThreadLocal

书接上回《【JUC进阶】13. InheritableThreadLocal》,提到了InheritableThreadLocal虽然能进行父子线程的值传递,但是如果在线程池中,就无法达到预期的效果了。为了更好的解决该问题,TransmittableThreadLocal诞生了。

有一只柴犬的专栏 2301

TransmittableThreadLocal (TTL) - 详解

TransmittableThreadLocal(TTL)是阿里开源的Java线程上下文传递解决方案,针对ThreadLocal在异步场景下的局限性而设计。它通过装饰器模式实现任务提交时的值抓取(Capture)、执行前的回放(Replay)和执行后的恢复(Restore)三步机制,完美解决了线程池场景下的上下文传递问题。支持手动包装任务或通过JavaAgent无侵入使用,广泛应用于链路追踪、日志上下文、权限传递等场景。相比InheritableThreadLocal仅在线程创建时传递值,TTL实现了线程复

M_Reus_11的博客 894

InheritableThreadLocal vs. TransmittableThreadLocal:线程间数据传递的终极对决

本文深入解析了InheritableThreadLocal与TransmittableThreadLocal在线程间数据传递中的差异与应用场景。重点探讨了TransmittableThreadLocal如何解决线程池环境下的上下文传递问题,通过值捕获、回放和恢复机制实现高效数据传递,适用于微服务架构和复杂异步处理场景。

t8u9v0的博客 785
上一篇: springboot idea 项目debug启动,红点内无对勾
下一篇: JAVA WEB文件下载缓存问题及解决方案
小硕同学
博客等级 码龄15年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值