请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于 ThreadLocal 需要加 static 的疑问

我看了老师给这位同学的解答,我有一点疑问,线程池中不同线程的线程,按图上说的是每一个 Thread 对应 ThreadLocalMap,然后 ThreadLocalMap 会 set 每一个 Thread 设置的 ThreadLocal 和 value 进去。
但是这里不应该是每个线程的 ThreadLocal 是不受干扰的吗。那不应该是每个线程独享一个 ThreadLocal 对象吗?
难道说这里的 ThreadLocal 里面才会去对应一个个线程,然后每个线程对应 一个 ThreadLocalMap 这样吗
图片描述

图片描述

代码如下

public class ThreadLocalNormalUsage02 {

    public static void main(String[] args) {

        new Service1().process();


    }

}

class Service1 {

    public void process() {
        User user = new User("张三");
        UserContextHolder.holder.set(user);
        new Service2().process();
    }

}

class Service2 {

    public void process() {
        User user = UserContextHolder.holder.get();
        System.out.println("service2:" + user.name);
        new Service3().process();
    }

}

class Service3 {

    public void process() {
        User user = UserContextHolder.holder.get();
        System.out.println("service2:" + user.name);
        UserContextHolder.holder.remove();
    }

}

class UserContextHolder {

    public static ThreadLocal<User> holder = new ThreadLocal<>();

}

 class User {
    String name;

    public User(String name) {
        this.name = name;
    }
}

正在回答

1回答

每个Thread不直接对应ThreadLocal,而是每个Thread可以有多个ThreadLocal。图的结构是对的,每一个 Thread 对应 ThreadLocalMap,然后 ThreadLocalMap 会 设置key是 ThreadLocal 和 value 进去。

0 回复 有任何疑惑可以回复我~
  • 提问者 潇歌 #1
    public static ThreadLocal<User> holder = new ThreadLocal<>(); 和线程里面的ThreadLocal 是同一个吗,感觉应该不是,这个 holder 已经被多个线程共享了
    回复 有任何疑惑可以回复我~ 2022-11-01 23:14:32
  • 悟空 回复 提问者 潇歌 #2
    是同一个ThreadLocal
    回复 有任何疑惑可以回复我~ 2022-11-03 22:40:44
  • 提问者 潇歌 回复 悟空 #3
    那老师,我是不是可以理解为每一个线程拿到 holder 之后,通过 holder 去操作 ThreadLocalMap 的 ThreadLocal 键值对
    回复 有任何疑惑可以回复我~ 2022-11-03 23:47:57

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信