假正经的小柴 2023-04-02 09:59 采纳率: 62.5%
浏览 17
已结题

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

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

img

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-02 13:40
    关注
    • 你看下这篇博客吧, 应该有用👉 :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;
      }
      
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 已采纳回答 4月2日
  • 修改了问题 4月2日
  • 创建了问题 4月2日

悬赏问题

  • ¥15 Unity发布gzip压缩的webgl之后让浏览器可以正常显示画面
  • ¥15 有没有人知道这种提示怎么关?现在不做ts项目了不知道咋关了,求解,现在我以前的js项目都是这种提示了
  • ¥15 为什么mysql做了碎片化处理data_free还是很高
  • ¥15 single positional indexer is out-of-bounds
  • ¥15 LSTM 模型数据量需要多少?
  • ¥15 mysql数据抓包开发报表
  • ¥15 linux系统下安装office打不开
  • ¥20 rsync脚本分发错误,文件不齐全
  • ¥15 labview顺序结构与时间延时
  • ¥15 脚本求解,源于数据库脚本变量筛选。