当前位置: 首页 > article >正文

什么是ThreadLocal的上下文丢失问题?

什么情况下发生上下文丢失

异步操作(如使用 CompletableFuture 或回调或线程池): 在多线程异步任务处理中,如果一个线程执行异步任务时使用了 ThreadLocal,并且该任务在另一个线程中继续执行(例如,线程 A 创建了一个异步任务,线程 B 执行了该任务),那么 ThreadLocal 中存储的上下文信息可能不会传递到线程 B,导致上下文丢失


解决方案

1.使用 InheritableThreadLocal自动传递上下文信息

InheritableThreadLocalThreadLocal 的一个子类,它能够将父线程中的 ThreadLocal 值传递到子线程。适用于需要将父线程的上下文传递给子线程的情况。

用这个InheritableThreadLocal它会自动将付线程的ThreadLocal传到子线程

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class InheritableThreadLocalExample {
    // 创建 InheritableThreadLocal
    private static final InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();

    public static void main(String[] args) {
        // 设置父线程的值
        inheritableThreadLocal.set("Parent Context");

        // 创建线程池(模拟子线程)
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        // 提交两个任务到线程池中
        executorService.submit(() -> {
            System.out.println("子线程1获取的值: " + inheritableThreadLocal.get());
        });

        executorService.submit(() -> {
            System.out.println("子线程2获取的值: " + inheritableThreadLocal.get());
        });

        // 关闭线程池
        executorService.shutdown();
    }
}

2.手动传递上下文信息

在异步任务和多线程场景中,可以通过显式传递上下文信息的方式来避免上下文丢失。例如,可以将 ThreadLocal 中的值传递给新的线程或异步任务,以确保上下文不丢失。

String context = threadLocal.get();
CompletableFuture.runAsync(() -> {
    // 将上下文传递到新的线程
    threadLocal.set(context);
});


http://www.kler.cn/a/531188.html

相关文章:

  • 每日一题——小根堆实现堆排序算法
  • csapp笔记3.6节——控制(1)
  • 北京门头沟区房屋轮廓shp的arcgis数据建筑物轮廓无偏移坐标测评
  • 51单片机 01 LED
  • TensorFlow 简单的二分类神经网络的训练和应用流程
  • R 字符串:深入理解与高效应用
  • FPGA|生成jic文件固化程序到flash
  • Git 的起源与发展
  • [STM32 标准库]EXTI应用场景 功能框图 寄存器
  • 二分/双指针/单调栈队列专题
  • shell -c
  • gdb 调试多进程中多线程的方法
  • linux远程链接mysql数据库的方法
  • 全面剖析 XXE 漏洞:从原理到修复
  • 读书笔记--分布式架构的异步化和缓存技术原理及应用场景
  • Weevely代码分析
  • Vue和Java使用AES加密传输
  • DeepSeek系列模型完全使用手册|附安装教程
  • SpringCloud系列教程:微服务的未来(二十)Seata快速入门、部署TC服务、微服务集成Seata
  • Vue.js 异步、延迟组件加载
  • 数据结构:时间复杂度
  • list容器(详解)
  • diffusion 训练trick 多横纵比设置
  • 算法总结-二分查找
  • 取模与加减乘除原理,模拟实现代码及相关公式推导
  • 【线程】基于阻塞队列的生产者消费者模型