ThreadLocal为什么用在成员变量上,方法中调用了值没变。

ThreadLocal为什么用在成员变量上,方法中对其修改了,但同线程下的ThreadLocal.get()值不会改变。类的初始化线程是一致的啊。使用局部变量可以改变。

img

下面箭头指的外部修改了,但放成员变量上的话修改不了,不知道为什么。

  • 你看下这篇博客吧, 应该有用👉 :ThreadLocal详解和如何解决ThreadLocal的内存泄漏问题
  • 除此之外, 这篇博客: 一文搞懂ThreadLocal及相关的内存泄露问题中的 ThreadLocal的get() 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在get方法的实现中,首先获取当前调用者线程,如果当前线程的threadLocals不为null,就直接返回当前线程绑定的本地变量值,否则执行setInitialValue方法初始化threadLocals变量。在setInitialValue方法中,类似于set方法的实现,都是判断当前线程的threadLocals变量是否为null,是则添加本地变量(这个时候由于是初始化,所以添加的值为null),否则创建threadLocals变量,同样添加的值为null。
    引用自:https://www.cnblogs.com/fsmly/p/11020641.html#_label0

    public T get() {
        //1、获取当前线程
        Thread t = Thread.currentThread();
        //2、获取当前线程的threadLocals变量
        ThreadLocalMap map = getMap(t);
        //3、如果threadLocals变量不为null,就可以在map中查找到本地变量的值
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        //4、执行到此处,threadLocals为null,调用该更改初始化当前线程的threadLocals变量
        return setInitialValue();
    }
    
    private T setInitialValue() {
        //protected T initialValue() {return null;}
        T value = initialValue();
        //获取当前线程
        Thread t = Thread.currentThread();
        //以当前线程作为key值,去查找对应的线程变量,找到对应的map
        ThreadLocalMap map = getMap(t);
        //如果map不为null,就直接添加本地变量,key为当前线程,值为添加的本地变量值
        if (map != null)
            map.set(this, value);
        //如果map为null,说明首次添加,需要首先创建出对应的map
        else
            createMap(t, value);
        return value;
    }