【某大厂一面】ThreadLocal如何实现主子线程之间的数据同步

embedded/2025/1/31 14:05:28/

ThreadLocal 是 Java 中用于实现线程本地存储的类,它为每个线程提供独立的变量副本,确保线程间的数据隔离。然而,ThreadLocal 本身并不直接支持主子线程之间的数据同步。要实现主子线程之间的数据同步,可以结合 InheritableThreadLocal 或其他机制。

1. 使用 InheritableThreadLocal

InheritableThreadLocalThreadLocal 的子类,允许子线程继承父线程的 ThreadLocal 变量。当创建子线程时,子线程会自动继承父线程的 InheritableThreadLocal 变量。

java">public class InheritableThreadLocalExample {private static InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();public static void main(String[] args) {inheritableThreadLocal.set("Parent Thread Value");Thread childThread = new Thread(() -> {System.out.println("Child Thread Value: " + inheritableThreadLocal.get());});childThread.start();}
}

在这个例子中,子线程会输出父线程设置的 InheritableThreadLocal 值。

2. 手动传递数据

如果 InheritableThreadLocal 不满足需求,可以手动将父线程的数据传递给子线程。例如,通过构造函数或方法参数传递数据。

java">public class ManualDataPassingExample {private static ThreadLocal<String> threadLocal = new ThreadLocal<>();public static void main(String[] args) {threadLocal.set("Parent Thread Value");String parentValue = threadLocal.get();Thread childThread = new Thread(() -> {threadLocal.set(parentValue);System.out.println("Child Thread Value: " + threadLocal.get());});childThread.start();}
}

3. 使用线程池时的注意事项

在使用线程池时,InheritableThreadLocal 可能无法正常工作,因为线程池中的线程是复用的。可以通过自定义 ThreadFactory 或使用 TransmittableThreadLocal(阿里巴巴的开源库)来解决。

4. 使用 TransmittableThreadLocal

TransmittableThreadLocal 是阿里巴巴开源的一个库,专门解决线程池环境下 InheritableThreadLocal 的局限性。

java">import com.alibaba.ttl.TransmittableThreadLocal;public class TransmittableThreadLocalExample {private static TransmittableThreadLocal<String> transmittableThreadLocal = new TransmittableThreadLocal<>();public static void main(String[] args) {transmittableThreadLocal.set("Parent Thread Value");Runnable task = () -> {System.out.println("Child Thread Value: " + transmittableThreadLocal.get());};ExecutorService executorService = Executors.newFixedThreadPool(1);executorService.submit(task);executorService.shutdown();}
}

总结

  • InheritableThreadLocal 适用于简单的父子线程数据传递。
  • 手动传递数据适用于需要更复杂控制的场景。
  • 在线程池环境下,考虑使用 TransmittableThreadLocal 或其他机制来确保数据同步。

http://www.ppmy.cn/embedded/158373.html

相关文章

langchain基础(二)

一、输出解析器&#xff08;Output Parser&#xff09; 作用&#xff1a;&#xff08;1&#xff09;让模型按照指定的格式输出&#xff1b; &#xff08;2&#xff09;解析模型输出&#xff0c;提取所需的信息 1、逗号分隔列表 CommaSeparatedListOutputParser&#xff1a;…

记录一个连不上docker中的mysql的问题

引言 使用的debian12,不同发行版可能有些许差异&#xff0c;连接使用的工具是navicat lite 本来是毫无思绪的&#xff0c;以前在云服务器上可能是防火墙的问题&#xff0c;但是这个桌面环境我压根没有使用防火墙。 直到 ying192:~$ mysql -h127.0.0.1 -uroot ERROR 1045 (28…

【精选】基于数据挖掘的招聘信息分析与市场需求预测系统 职位分析、求职者趋势分析 职位匹配、人才趋势、市场需求分析数据挖掘技术 职位需求分析、人才市场趋势预测

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

汇编的使用总结

一、汇编的组成 1、汇编指令&#xff08;指令集&#xff09; 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令&#xff0c;但是可以起到指令的作用&#xff0c;伪…

LVGL+FreeRTOS实战项目:智能健康助手(lcd篇)

1.8寸彩色TFT显示屏简介 接线图 我们选用的是分辨率为128*160的彩色显示屏&#xff0c;采用的SPI接口&#xff0c;通过我们STM32的SPI外设&#xff0c;来和我们的屏幕进行通信&#xff0c;以显示我们需要显示的图片。 软件部分 #include "lcd_driver.h"//液晶IO初始…

selenium自动化测试框架——面试题整理

目录 1. 什么是 Selenium&#xff1f;它的工作原理是什么&#xff1f; 2. Selenium 主要组件 3. 常见 WebDriver 驱动 4. Selenium 如何驱动浏览器&#xff1f; 5. WebDriver 协议是什么&#xff1f; 6. Page Object 模式与 Page Factory 7. 如何判断元素是否可见&#x…

第七章 C - D 开头的术语

文章目录 第七章 C - D 开头的术语当前设备 (current device)当前目录 (current directory)基于游标的 SQL (cursor-based SQL)游标 (cursor)自定义存储 (custom storage) 以 D 开头的术语数据库 (database)数据库缓存 (database cache)数据库加密 (database encryption)数据库…

ubuntu 把安装好的 wine软件 打包 到另外一台机器

ubuntu迁移已安装的软件到新的机器上_如何把 一台主机的软件 拷贝到另外台机器 ubuntu-CSDN博客 sudo apt-get install apt-clone原来机器备份&#xff1a;sudo apt-clone clone dst_add --with-dpkg-repack备份到dst_add 下&#xff0c;会生成一个 tar 包 假设为 clone.ta…