首页 > 其他分享 >threadLocal

threadLocal

时间:2022-10-09 20:12:37浏览次数:71  
标签:map Thread ThreadLocalMap value threadLocal 线程 threadLocals

https://juejin.cn/post/7126708538440679460
每个线程持有一个threadLocalMap
key是TheadLocal,value是泛型对象

 public void set(T value) {
        Thread t = Thread.currentThread(); //获取当前线程t
        ThreadLocalMap map = getMap(t);  //根据当前线程获取到ThreadLocalMap
        if (map != null)  //如果获取的ThreadLocalMap对象不为空
            map.set(this, value); //K,V设置到ThreadLocalMap中
        else
            createMap(t, value); //创建一个新的ThreadLocalMap
    }
    
     ThreadLocalMap getMap(Thread t) {
       return t.threadLocals; //返回Thread对象的ThreadLocalMap属性
    }

    void createMap(Thread t, T firstValue) { //调用ThreadLocalMap的构造函数
        t.threadLocals = new ThreadLocalMap(this, firstValue); this表示当前类ThreadLocal
    }

    public T get() {
        Thread t = Thread.currentThread();//获取当前线程t
        ThreadLocalMap map = getMap(t);//根据当前线程获取到ThreadLocalMap
        if (map != null) { //如果获取的ThreadLocalMap对象不为空
            //由this(即ThreadLoca对象)得到对应的Value,即ThreadLocal的泛型值
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value; 
                return result;
            }
        }
        return setInitialValue(); //初始化threadLocals成员变量的值
    }
    
     private T setInitialValue() {
        T value = initialValue(); //初始化value的值
        Thread t = Thread.currentThread(); 
        ThreadLocalMap map = getMap(t); //以当前线程为key,获取threadLocals成员变量,它是一个ThreadLocalMap
        if (map != null)
            map.set(this, value);  //K,V设置到ThreadLocalMap中
        else
            createMap(t, value); //实例化threadLocals成员变量
        return value;
    }


标签:map,Thread,ThreadLocalMap,value,threadLocal,线程,threadLocals
From: https://www.cnblogs.com/sjj123/p/16773492.html

相关文章

  • ThreadLocal、InheritThreadLocal、TransmittableThreadLocal
    一、ThreadLocal多线程是Java实现多任务的基础,​​Thread​​​对象代表一个线程,我们可以在代码中调用​​Thread.currentThread()​​获取当前线程。例如,打印日志时,可以同......
  • ThreadLocal本地局部线程demo
    ThreadLocal本地局部线程demoimportorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.util.HashMap;importjava.util.Map;/***本工具只能保存一......
  • 面试必备:ThreadLocal详解
    前言大家好,我是捡田螺的小男孩。无论是工作还是面试,我们都会跟ThreadLocal打交道,今天就跟大家聊聊ThreadLocal哈~ThreadLocal是什么?为什么要使用ThreadLocal一个Thre......
  • 惊!ThreadLocal你怎么动不动就内存泄漏?
    “今天无聊带大家分析下ThreadLocal为什么会内存泄漏~前言使用ThreadLocal不当可能会导致内存泄露,是什么原因导致的内存泄漏呢?正文我们首先看一个例子,代码如下:pub......
  • ThreadLocal夺命11连问
    前言前一段时间,有同事使用ThreadLocal踩坑了,正好引起了我的兴趣。所以近期,我抽空把ThreadLocal的源码再研究了一下,越看越有意思,发现里面的东西还真不少。我把精华浓缩了......
  • ThreadLocal
    ThreadLocal是一个数据结构,有点像HashMap,可以保存key-value键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰。ThreadLocal为变量在每个线程中都创建一个......
  • PageHelper中的ThreadLocal未清空问题
    起因前几天运维发现项目中的XXL执行的时候突然报异常,看了一波异常日志,发现XXl中的普通list查询竟然跑到PageHelper中的我写的分页权限过滤器了。正常来说,我只是简单查询,应......
  • TransmittableThreadLocal和@Async优雅的记录操作日志
    此文主要讲解:如何实现操作记录如何将TransmittableThreadLocal和@Async搭配使用TransmittableThreadLocal阿里的一个开源组件,为了在使用线程池等会池化复用线程的执行......
  • 面试~ThreadLocal
    四种常见的引用强引用---不可回收软引用---内存不足即回收弱引用---发现即回收虚引用---形同虚设,目的是用于对象回收跟踪ThreadLocal1、ThreadLoca是什么ThreadL......
  • Spring 中使用自定义的 ThreadLocal 存储导致的坑
    Spring中有时候我们需要存储一些和Request相关联的变量,例如用户的登陆有关信息等,它的生命周期和Request相同。一个容易想到的实现办法是使用ThreadLocal:pub......