dee*_*TRA 4 java multithreading thread-local spring-boot
正如我们所知,Tomcat 有大约 200 个线程,而 Jetty 在它们各自的线程池中有一些默认计数的线程。所以如果我们在ThreadLocal每个请求中设置一些东西,它会在线程中存在终生还是 Tomcat 会ThreadLocal在每个请求之后清除。
如果我们在过滤器的 userContext 中设置了一些东西,我们是否需要在过滤器每次退出时清除它?
或者如果我们没有线程池配置,Web 服务器是否每次都会创建一个新线程?
public static final ThreadLocal<UserContextDto> userContext = new ThreadLocal<>();
Run Code Online (Sandbox Code Playgroud)
是的,您需要清除 ThreadLocal。Tomcat 不会清除 ThreadLocals。
不,不是每次都创建新线程。池中的线程用于为请求提供服务,并在请求完成后返回到池中。
这不仅适用于 Tomcat,也适用于 Jetty 和 Undertow。为每个请求创建线程在资源和时间方面都是昂贵的。
不,Tomcat 不会清除您的代码创建的 ThreadLocals,这意味着它们将保留并可能污染后续请求。
因此,每当您创建一个请求时,请确保在同一请求或任何其他请求存在之前将其清除。
还应该注意的是,后续请求 - 即使使用相同的 URL - 也可能在完全不同的线程中执行,因此 ThreadLocal 不是一种在请求之间保存状态的机制。为此,可以使用 SessionBeans 之类的东西。
| 归档时间: |
|
| 查看次数: |
5379 次 |
| 最近记录: |