关于 ThreadLocal 需要加 static 的疑问

来源:4-15 收不回来的value

潇歌

2022-11-01

我看了老师给这位同学的解答,我有一点疑问,线程池中不同线程的线程,按图上说的是每一个 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回答

悟空

2022-11-01

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

0
5
潇歌
非常感谢!
2022-11-05
共5条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程