gpt4 book ai didi

java - 这个 LocalThread 会覆盖其他 Servlet 请求的数据吗?

转载 作者:行者123 更新时间:2023-12-02 01:24:29 25 4
gpt4 key购买 nike

我有以下请求上下文类,用于收集某些信息以供将来在 Servlet 过滤器中处理:

public class ApplicationRequestContext {
private static final ThreadLocal<AppRequest> tl = new ThreadLocal<AppRequest>();

public static void begin(HttpServletRequest httpRequest) {
tl.set(getAppRequest(httpRequest));
}

public static void finish() {
tl.remove();
}
}

getAppRequest(httpRequest) 仅返回一个对象。并在 Servlet 过滤器中...

public class ApplicationServletFilter implements javax.servlet.Filter {
@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
ApplicationRequestContext.begin(httpRequest);
/* other stuff */
chain.doFilter(httpRequest, httpResponse);
} catch (Exception e) { /* … */ }
finally {
ApplicationRequestContext.finish();
}
}
}

我想知道,此设置是否可以有多个传入请求可能覆盖彼此的数据(getAppRequest(httpRequest) 对象显然是唯一的) ?这甚至是线程安全的吗?

最佳答案

你必须记住,每个Thread有自己的ThreadLocal ——实际上,准确地说,是它自己的 ThreadLocal.ThreadLocalMap (我使用 OpenJDK 作为示例)。

当您的 ThreadLocal ,名为tl ,调用其 set() method ,它基本上创建了一个新的 ThreadLocalMap并有tl作为create a ThreadLocalMap.Entry 的关键引用.

由于每个 Servlet 请求都使用唯一的线程(来自托管线程池或生成新线程,并且事实上没有两个 Servlet 线程处理相同的请求),则 tl.set()有那个ThreadLocal新创建的ThreadLocalMap作为对该 Servlet Thread 的引用的ThreadLocal.ThreadLocalMap .

现在,当 tl.get() is called ,我们只需获取 Servlet ThreadThreadLocalMap ,然后执行 lookup with ThreadLocalMap.getEntry() ,获取我们输入的值,例如getAppRequest(httpRequest) .

这里要记住的要点是,是的,您正在使用单个 ThreadLocal对象,名为 tl ,但是每个Thread ,在这种情况下,Servlet 容器用来处理每个请求(包括其过滤器)的线程将拥有自己的 ThreadLocal.ThreadLocalMap与此 ThreadLocal 的[弱]引用对象作为其键。

所以,t1只是 ThreadLocal.ThreadLocalMap.Entry 表中的一个键( tl.ThreadLocalMap.Entry ) 获取 ThreadLocalThread.ThreadLocalMap这是该线程独有的。因此,它是线程安全的,那些begin()finish()调用基本上是将数据放入每个Thread中的。

关于java - 这个 LocalThread 会覆盖其他 Servlet 请求的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57154698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com