假正经的小柴 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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。