threadlocal 同一个线程池多次set会覆盖,被覆盖的会被gc?
时间: 2023-10-28 20:43:43 浏览: 45
对,每个线程都有自己的ThreadLocalMap,其中存储了该线程所有的ThreadLocal变量以及对应的值。当ThreadLocal变量被设置时,实际上是向当前线程的ThreadLocalMap中存储值。如果同一个线程池多次set同一个ThreadLocal变量,后面的值会覆盖前面的值。当ThreadLocal变量所对应的线程结束后,如果ThreadLocal变量没有被其他地方引用,则会被垃圾回收。
相关问题
每个线程只会创建一次同一个ThreadLocal对象吗
不完全正确。每个线程会在第一次调用 `ThreadLocal` 对象的 `get()` 或 `set()` 方法时,为该线程创建一个变量副本。在之后的调用中,该线程会使用自己的变量副本。
如果一个线程在某一时刻没有调用过 `get()` 或 `set()` 方法,那么它不会有对应的变量副本,所以在之后调用 `get()` 方法时会返回 `null` 或者指定的默认值。
需要注意的是,即使多个线程使用同一个 `ThreadLocal` 对象,它们之间的变量副本也是相互独立的,互不干扰。这也是 `ThreadLocal` 的重要作用之一:提供线程隔离,防止多个线程之间的变量冲突。
每个请求里new Thread,请求结束,Thread会被gc回收?Thread里的ThreadLocal会被回收?
可以回答:每个请求里的new Thread并不会被立刻回收,而是被加入到Java虚拟机的ThreadGroup中。当ThreadGroup中的所有线程均已执行完毕并且所有线程都已经被释放,ThreadGroup才会被回收。而ThreadLocal变量是线程本地变量,只有在对应线程被回收时,ThreadLocal变量才会被回收。因此,在每个请求结束时,ThreadLocal并不会立刻被回收,而是在该请求所生产的线程被回收时才会被回收。