每个请求里new Thread,请求结束,Thread会被gc回收?Thread里的ThreadLocal会被回收?
时间: 2023-11-07 16:22:43 浏览: 324
可以回答:每个请求里的new Thread并不会被立刻回收,而是被加入到Java虚拟机的ThreadGroup中。当ThreadGroup中的所有线程均已执行完毕并且所有线程都已经被释放,ThreadGroup才会被回收。而ThreadLocal变量是线程本地变量,只有在对应线程被回收时,ThreadLocal变量才会被回收。因此,在每个请求结束时,ThreadLocal并不会立刻被回收,而是在该请求所生产的线程被回收时才会被回收。
相关问题
你对ThreadLocal的理解?
ThreadLocal是Java中的一个线程局部变量,它为解决多线程并发问题提供了一种新的解决方式。每个线程都有自己的ThreadLocal实例,可以在不同的线程中存储不同的值,而且这些值互不干扰。ThreadLocal的使用场景非常丰富,比如在Web应用中,可以将当前用户的信息存储在ThreadLocal中,方便在不同的地方获取。
在JDK8中,ThreadLocal的设计是每一个Thread都维护一个ThreadLocalMap,这个Map的key就是ThreadLocal实例本身,value才是真正要存储的值。由于ThreadLocalMap只持有ThreadLocal的弱引用,没有任何强引用指向ThreadLocal实例,所以ThreadLocal就可以顺利被GC回收,此时Entry中的key=null。
总之,ThreadLocal是Java中非常重要的一个工具类,它可以帮助我们解决多线程并发问题,提高程序的性能和可维护性。
ThreadLocalMap和ThreadLocal的区别是不是在于ThreadLocalMap每个线程可以保存多个值
不完全正确。ThreadLocalMap和ThreadLocal的区别在于它们各自的作用和功能。ThreadLocal是一个线程局部变量,它可以在当前线程中存储和获取值,且不同线程之间互不干扰。而ThreadLocalMap是每个线程中用于存储当前线程中的所有ThreadLocal对象的值的一个Map对象。每个ThreadLocal对象在ThreadLocalMap中都对应着一个唯一的Entry对象,而每个Entry对象只能保存一个值。因此,ThreadLocalMap中每个线程只能保存多个ThreadLocal对象的值,而每个ThreadLocal对象在ThreadLocalMap中只能保存一个值。需要注意的是,如果ThreadLocal没有被ThreadLocalMap以外的对象引用,则在下一次GC的时候,ThreadLocal实例就会被回收,那么此时ThreadLocalMap里的一组KV的K就是null了,因此在没有额外操作的情况下,此处的V便不会被外部访问到,而且只要Thread实例一直存在,Thread实例就强引用着ThreadLocalMap,因此ThreadLocalMap就不会被回收,那么这里K为null的V就一直占用着内存。
阅读全文