线程数据共享必学的3个工具类: ThreadLocal InheritableThreadLocal TransmittableThreadLocal

news2025/1/12 0:59:55

线程数据共享必学的3个工具类:
ThreadLocal
InheritableThreadLocal
TransmittableThreadLocal

1.ThreadLocal:在当前线程中共享数据的,JUC 中提供的
2.InheritableThreadLocal:也是JUC中的一个工具类,解决 ThreadLocal 难以解决的问题
3.TransmittableThreadLocal:阿里开源的一个工具类,解决上面2个ThreadLocal 难以搞定的问题
也就是一个比一个强,也不能这么说,而是各有各的使用场景,

    private ThreadLocal<String> userNameItl = new ThreadLocal<>();
    // private InheritableThreadLocal<String> userNameItl = new InheritableThreadLocal<>();

    public void inheritableThreadLocal1() throws InterruptedException {
        userNameItl.set("张三");
        log.info("userName:{}", userNameItl.get());

        // 创建了一个子线程thread1,在子线程中区获取值
        new Thread(() -> {
            // ThreadLocal 时 userName:null

            /**
             * InheritableThreadLocal 时 userName:张三
             *
             * 存在的问题(子线程复制一次父线程之后,父子线程中的InheritableThreadLocal就没有关系了,父线程中|nheritableThreadLoca!的值再修改,也不会影响子线程中的值了)
             * 见:https://www.bilibili.com/video/BV1Pz421S7Wx/?spm_id_from=pageDriver&vd_source=deac72a1d60ac5149e7eb3f9a4998402
             * InheritableThreadLocal 如果用在线程池上,会有问题,可能导致严重的事故,这个一定要知道。
             *
             * 导致的原因:
             * 分析下结果
             * 从结果中看,线程池执行了2次任务,2次拿到的都是张三,和主线程第一次放入的值是一样的,而第二次主线程中放入的是李四啊,但是第二次线程池中拿到的却
             * 是张三,这是什么原因?
             * 上面线程池的大小是1,也就是说这个线程池中只有一个线程,所以让线程池执行的2次任务用到的都是一个线程,从上面的日志中可以看到线程名称都是 p001-1-
             * thread-1,说明这两次任务,都是线程池中同一个线程执行的。
             * 线程池中的线程是重复利用的,线程池中的po01-1-thread-1这个线程是什么时候创建的呢?谁创建的?他的父线程是谁?
             * 1.是主线程中第一次调用executorSerice.execute让线程池执行任务的时候,线程池发现当前线程数小于核心线程数,所以会创建一个线程
             * 2.他的父线程是谁?是创建他的线程,也就是执行第一次执行executorService.execute的线程,即主线程
             * 子线程创建的时候,子线程会将父线程中lnheritableThreadLocal的值复制一份到子线程的InheritableThreadLocal中,从上面代码中可以看到,父线程
             * nheritabiehreadLcal中第一次丢入的是张三,之后就调用线程池gexecute万法执行任务,比时,会在线程池中创建子线程,这个子线程会将分线程中
             * InheritableThreadLocal中设置的张三,复制到子线程的lnhertableThreadLocal中,此时子线程中的用户名就是从父线程复制过来的,即:张三
             * 复制之后,父子线程中的InheritableThreadLocal就没有关系了,父线程中|nheritableThreadLoca!的值再修改,也不会影响子线程中的值了,所以两次输出的都
             * 是张三。
             *
             * 如何解决这个问题呢?
             * 阿里的:TransmittableThreadLocal,这个就是为了解决这个问题来的。
             * 1、需要引入maven配置
             *    <dependency>
             *      <groupId>com.alibaba</groupId>
             *      <artifactId>transmittable-thread-local</artifactId>
             *      <version>2.14.3</version>
             *    </dependency>
             *  2、使用TransmittableThreadLocal 代替InherltableThreadLocal 或 ThreadLocal (TransmittapleThreadLocal<string> userNameTtl = new TransmittableThreadLocal<string>();)
             *     程池需要用TtlExecutors.getTtlExecutorService 包裹一下,这个定不要漏掉
             *     Executorservice executorservice = TtlExecutors.getTtlExecutorService(Executors.newFixedThreadPool(1));
             * 
             */
            log.info("userName:{}", userNameItl.get());
        }, "thread1").start();
        TimeUnit.SECONDS.sleep(1);

    }

    public static void main(String[] args) throws InterruptedException {
        new CutterOperatorScheduleJob().inheritableThreadLocal1();
    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MPLS原理与配置

1.MPLS概述 &#xff08;1&#xff09;传统IP路由转发 &#xff08;2&#xff09;MPLS基本概念 ⦁ MPLS起源于IPv4&#xff08;Internet Protocol version 4&#xff09;&#xff0c;其核心技术可扩展到多种网络协议&#xff0c;包括IPv6&#xff08;Internet Protocol ver…

WPF中CommandParameter用法

1. 界面样式 2. XAML中代码部分 <ButtonGrid.Row"0"Grid.Column"1"Command"{Binding BtnClick_Number}"CommandParameter"7"Content"7"Style"{StaticResource BtnStyle_Num}" /> <ButtonGrid.Row"…

我的第一个JAVA程序IDEA版

目录 第一步 新建一个空项目第二步 新建模块第三步 新建包第四步 新建类第五步 新建main方法 第一步 新建一个空项目 第二步 新建模块 第三步 新建包 第四步 新建类 然后在包文件夹下新建类 第五步 新建main方法

xlrd.biffh.XLRDError: Excel xlsx file; not supported报错原因

xlrd库读取xlsx文件时报错 xlrd.biffh.XLRDError: Excel xlsx file; not supported报错原因&#xff1a; xlrd版本为2.1版本&#xff0c;需要读取xlsx文件需要安装xlrd低一些版本1.2.0版本&#xff0c;重新安装重试即可 更换xlrd版本 重新运行

如何使用ffmpeg 实现10种特效

相关特效的名字 特效id 特效名 1 向上移动 2 向左移动 3 向下移动 4 颤抖 5 摇摆 6 雨刷 7 弹入 8 弹簧 9 轻微跳动 10 跳动 特效展示(同时汇总相关命令) pad背景显示 pad背景透明 相关命令(一会再讲这些命令&#xff0c;先往下看) # 合成特效语音 ffmpeg -y -loglevel erro…

【Linux】Linux信号产生,接受与处理机制

理解Linux信号产生&#xff0c;接受与处理机制 信号是Linux操作系统中一种用于进程间通信和异步事件处理的机制。在本文中&#xff0c;我们将结合Linux的源码&#xff0c;深入分析信号的产生、发送、接收和处理的底层原理。 文章目录 理解Linux信号产生&#xff0c;接受与处理…

Elasticsearch集群和Logstash、Kibana部署

1、 Elasticsearch集群部署 服务器 安装软件主机名IP地址系统版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.56centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 软件版本&#xff1a;elasticsearch-7.13.2.tar.gz 示…

asp.net core接入prometheus

安装prometheus和Grafana 参考之前的文章->安装prometheus和Grafana教程 源代码 dotnet源代码 新建.net core7 web项目 修改Program.cs using Prometheus;namespace PrometheusStu01;public class Program {public static void Main(string[] args){var builder We…

Linux中ftp配置

一、ftp协议 1、端口 ftp默认使用20、21端口 20端口用于建立数据连接 21端口用于建立控制连接 2、ftp数据连接模式 主动模式&#xff1a;服务器主动发起数据连接 被动模式&#xff1a;服务器被动等待数据连接 二、ftp安装 yum install -y vsftpd #---下…

4. Java多线程面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 为什么要使用并发编程 充分利用多核CPU的计算能力&#xff1a;通过并发编程的形式可以将多核CPU的计算能力发挥到极致&#xff0c;性能得到提升方便进行业务拆分&#xff0c;提升系统并发能力和性能&#xff1a;在特殊的业务场景下&#…

cnpm 安装失败

安装淘宝镜像 //旧 证书已过期 npm config set registry https://registry.npm.taobao.org/ //运行这个会报错 //npm ERR! code CERT_HAS_EXPIRED //npm ERR! errno CERT_HAS_EXPIRED //用下边最新的安装 //新 npm config set registry https://registry.npmmirror.com这里安装…

SSE 与 SASE哪个云原生安全框架更加适合

近年来&#xff0c;随着云计算和网络技术的不断发展&#xff0c;出现了一种新的网络安全解决方案——SASE&#xff08;安全访问服务边缘&#xff09;。SASE是一种将网络和安全功能融合到单个基于云的服务中的框架&#xff0c;旨在提供更加安全、高效和便捷的网络访问体验。SASE…

【机器学习与实现】支持向量机SVM

目录 一、SVM (Support Vector Machine) 概述&#xff08;一&#xff09;支持向量机SVM的主要特点&#xff08;二&#xff09;支持向量与间隔最大化&#xff08;三&#xff09;线性可分/不可分&#xff08;四&#xff09;软间隔 (soft margin) 与核技巧 (kernel trick)&#xf…

web前端学习笔记11

11. CSS3高级特效 11.1 CSS3变形 CSS3变形是一些效果的集合, 如平移、旋转、缩放、倾斜效果 每个效果都可以称为变形(transform),它们可以分别操控元素发生平移、旋转、缩放、倾斜等变化 语法 transform:[transform-function] ; /* 设置变形函数,可以是一个,也可以是多…

vscode插件-07Java

文章目录 Extension Pack for JavaSpring Initializr Java SupportCodeSwingJdk下载JDK安装jdkWindows安装jdkLinux安装jdk&#xff08;以Ubuntu为例&#xff09; jdk环境变量在VScode中配置Windows系统中配置Linux系统中配置&#xff08;以Ubuntu为例&#xff09; Extension P…

arcgis 10.6 工具栏操作error 001143 后台服务器抛出异常

arcgis 10.6 工具栏操作error 001143 后台服务器抛出异常 环境 win10arcgis 10.6 问题 执行定义投影要素转线出现 Error: 001143:后台服务器抛出异常&#xff08;差点重装10.6&#xff09; 如下图所示&#xff1a; 解决方法 通过在菜单工具条上单击地理处理 > 地理处…

Linux进程相关查询

1、Linux下查看某些进程的启动时间和运行时长 比如查看java进程的启动时间和运行时长 # ps -ef|grep -v grep|grep -w java|awk {print $2} # ps -eo pid,lstart,etime | grep 1973 其中&#xff1a; Mon Jun 24 09:25:41 2019 为java进程的启动时间 4-00:16:55 …

LeetCode-Pow(x, n)【递归 数学】

[TOC](LeetCode-Pow(x, n)【递归 数学】) 题目描述&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示例 2&#xf…

【Linux】套接字的理解 基于TCP协议的套接字编程(单/多进程 / 线程池|英汉互译 / C++)

文章目录 1. 前言1.1 网络方面的预备知识&#x1f447;1.2 了解TCP协议 2. 关于套接字编程2.1 什么是套接字 Socket2.2 socket 的接口函数2.3 Udp套接字编程的步骤2.4 sockaddr 结构 3. 代码实现3.1 makefile3.2 log.hpp3.3 tcp_server.hpp① 框架② service() 通信服务③ init…

HTML静态网页成品作业(HTML+CSS)——利物浦足球俱乐部介绍网页设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;共有5个页面。 二、作品演示 三、代码目录 四、网站代码 HTML部分代…