首页 > 其他分享 >ThreadLocal与InheritableThreadLocal

ThreadLocal与InheritableThreadLocal

时间:2024-12-25 16:42:56浏览次数:5  
标签:set String inheritableThreadLocal ThreadLocal 线程 InheritableThreadLocal executor

ThreadLocal底层是个map每次set值的时候把当前线程与值放到里面
    ThreadLocal.ThreadLocalMap threadLocals = null;

  

 

 

 

这种结构在大数据量并发请求时会,会产生内存泄漏。
请求时set进去,正常退出move掉,来不及remove的数据会停留在内存中,外界还有引用,gc不会收就会泄露

  如果子线程需要使用父级的数据去处理任务,然后回到父线程归纳处理,这时候ThreadLocal就不满足了

    private static ThreadLocal<String> inheritableThreadLocal = new ThreadLocal<>();

    public static void main(String[] args) throws IOException {

        inheritableThreadLocal.set("Value from parent thread");
        // 创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        // 提交任务(创建子线程)
        for (int i = 0; i < 5; i++) {
            executorService.submit(
                    () -> {
                        try {
                            // 子线程中获取从父线程继承的值
                            String value = (String) inheritableThreadLocal.get();
                            System.out.println("Value in child thread: " + value);
                        } finally {
                            // 任务执行完毕后清除值
                            inheritableThreadLocal.remove();
                        }
                    });
        }
        // 关闭线程池
        executorService.shutdown();
    }

  这时候子线程获取父级线程的数据就是空

 

InheritableThreadLocal是ThreadLocal子类,其区别

  

标签:set,String,inheritableThreadLocal,ThreadLocal,线程,InheritableThreadLocal,executor
From: https://www.cnblogs.com/wangbiaohistory/p/18630825

相关文章

  • Threadlocal(一):用户会话管理重构 “神器”,新手破局,老手重构升维之选!
    提到前面:一个热衷技术,反对八股的资深研发,不卖课不引流,专注分享高质量教学博客。如果觉得文章还不错的话,可以点赞+收藏+关注支持一下,持续分享高质量技术博客。如果有什么需要改进的地方还请大佬指出❌欢迎学习交流,直接私我引言面试的时候是不是经常被问到并发编程?是......
  • TransmittableThreadLocal获取当前登录用户
    要使用TransmittableThreadLocal实现用户登录后记录用户信息,并在用户退出时清除信息,你可以按照以下步骤进行:<dependency><groupId>com.alibaba</groupId><artifactId>transmittable-thread-local</artifactId><version>2.12.0</version></dependen......
  • TransmittableThreadLocal的实现机制和原理
    1前言前面我看过了ThreadLocal的实现机制和原理以及InheritableThreadLocal的实现机制和原理两种类型的ThreadLocal,前者是普通的,后者是在前者的基础上套了一层父子线程关系,当使用后者的时候,会在线程创建的时候,浅拷贝一份父线程的变量值。那么今天空了,我来看看另外一种Threa......
  • ThreadLocal源码解析
    简介ThreadLocal见名知意,线程本地变量,它为每个使用该变量的线程都提供一个独立的副本,使得变量在线程间隔离,从而达到线程安全的目的。这里先提供一张ThreadLocal的结构示意图,下文在具体分析。源码解析从上面的结构示意图可以清晰的看到,ThreadLocal内部有个静态内部类Thre......
  • python - threadlocal
    功能:给线程创建一些变量,线程彼此之间是完全隔离的,每个线程使用各自的线程。使用场景:在处理数据库事务过程中,业务开始时,获取连接,业务结束时,关闭连接,中间的业务是未知的。想封装这样的代码,就可以用threadlocal。importthreading#创建threading.local的实例local=threa......
  • pagehelper常见问题【分页失效】【ThreadLocal污染线程】
    ......
  • ThreadLocal是如何实现线程隔离的?
    ThreadLocal是Java中实现线程隔离的关键工具。它通过提供每个线程自己的变量副本来确保线程之间数据的独立性。下面是ThreadLocal如何实现线程隔离的详细讲解:1.数据存储结构ThreadLocal关键在于其内部管理的数据存储结构。在Java中,ThreadLocal创建了一个与线程......
  • InheritableThreadLocal从入门到放弃
    作者:京东零售田超辉背景:一个上线了很久但是请求量很低(平均每天一两次)的历史功能突然出现空指针报错:  我们翻开代码定位到对应的报错代码:  结合堆栈和代码可以确定是由于bdIdJobMap的值为null导致往bdIdEmployeeJobMap这个map中putAll的时候空指针了。而bdIdJobM......
  • 【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLo
    文章目录【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)1.基本API介绍2.简单用法3.应用场景4.Threadlocal与Synchronized区别5.内存溢出和内存泄漏5.2内存溢出(MemoryOverflow)5.2内存泄漏(Mem......
  • 《深入解析 Java 中的 ThreadLocal》
    ThreadLocal1.概述ThreadLocal被称为线程局部变量,用于在线程中保存数据。由于在ThreadLocal中保存的数据仅属于当前线程,所以该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal用于在同一个线程间,在不同的类和方法之间共享数据的的场景,也可以......