Java spring boot中的线程局部行为

Java spring boot中的线程局部行为,java,multithreading,spring-boot,thread-local,Java,Multithreading,Spring Boot,Thread Local,正如我们所知,Tomcat有大约200个线程,Jetty在各自的线程池中有一些默认计数线程。因此,如果我们在每个请求的ThreadLocal中设置了某个内容,那么它将在线程中存在一辈子,还是Tomcat会在每个请求后清除ThreadLocal 如果我们在过滤器的userContext中设置了一些内容,那么我们是否需要在每次过滤器退出时清除它 或者,如果我们没有线程池配置,web服务器会每次创建一个新线程吗 public static final ThreadLocal<UserContex

正如我们所知,Tomcat有大约200个线程,Jetty在各自的线程池中有一些默认计数线程。因此,如果我们在每个请求的
ThreadLocal
中设置了某个内容,那么它将在线程中存在一辈子,还是Tomcat会在每个请求后清除
ThreadLocal

如果我们在过滤器的userContext中设置了一些内容,那么我们是否需要在每次过滤器退出时清除它

或者,如果我们没有线程池配置,web服务器会每次创建一个新线程吗

public static final ThreadLocal<UserContextDto> userContext = new ThreadLocal<>();
public static final ThreadLocal userContext=new ThreadLocal();

不,Tomcat不会清除代码创建的线程局部变量,这意味着它们将保留下来,并可能污染后续请求

因此,无论何时创建一个请求,请确保在该请求或其他任何请求退出之前将其清除


还应注意,后续请求(即使使用相同的URL)也可能在完全不同的线程中执行,因此ThreadLocals不是保存请求之间状态的机制。为此,可以使用SessionBeans之类的东西。

如果您将某个东西放在ThreadLocal中的某个线程不是100%受您控制的(即从其他代码调用的线程,如HTTP请求),则需要在离开代码之前清除您设置的任何内容

一个
尝试
/
最后
结构是一个很好的方法

线程池不能为您完成这项工作,因为Java API不提供清除线程的
ThreadLocal
变量的方法。(这可以说是Java API中的一个缺点)

不这样做会有内存泄漏的风险,尽管它受到线程池大小的限制(如果有的话)


一旦将同一线程再次分配给了解
ThreadLocal
的代码,如果没有删除它,您将看到上一个请求中的旧值。依靠那是不好的。这可能导致难以追踪的bug、安全漏洞等。

是的,您需要清除ThreadLocal。Tomcat不会清除本地人

不,不是每次都创建新线程。池中的线程用于服务请求,并在请求完成后返回池

这不仅适用于Tomcat,也适用于码头和底拖。为每个请求创建线程在资源和时间上都很昂贵