java - Thread Local - 我做错了什么?

标签 java spring servlets httprequest thread-local

[IMG] http://i60.tinypic.com/121bww0.jpg[/IMG] (请求高代表用户,请链接图片,它会支持问题。)

你好, 该图像描述了我所理解的网络应用程序流程。 浏览器向 spring dispatcher servlet 发送请求。 servlet 为每个请求生成一个新线程(我假设它默认这样做。我不知道它是如何控制的。) 代码如下:

public class Result{
    private List<String> response = new ArrayList<String>();
    public setResponse(List<String> list){
        this.response = list;
    }

    public list<String> getResponse(){
        return response ;
    }
}

public class ResponseUtil {
    private static final ThreadLocal<Result> responseObject = new  InheritableThreadLocal<Result>();

    public static void initialize(){
        if(responseObject.get() == null){
            Result result= new Result();
            result.setResponse(new ArrayList<String>());
            responseObject.set(result);
        }
    }

    public static void addMessage(String message){
        List<String> messages = responseObject.get().getResponse();
        messages.add(message);
    }

    public static Response getResponse(){
        return responseObject.get();
    }

}

@Component
public class OnboardingEndPointImpl {

    public Result processOnBoardingFile() {
        ResponseUtil.initialize();
        ResponseUtil.addMessage("a"); 

        return ResponseUtil.getResponse();
    }

}

在发送两个 rest 调用时,输出为“a”、“a”。尽管它是本地线程,但该字符串正在追加到同一个列表。

我的理解是,每个 http 请求(rest 调用)都会产生一个新线程。每次调用都以调用 initialize() 方法开始。由于每个请求都是一个新线程,因此每个 http 请求的 threadLocal 必须是分开的,但实际上我是线程正在写入同一个列表。所以所有的消息都被添加到同一个列表中。 这种行为只有在两个调用都是同一个线程时才会发生。

谢谢

最佳答案

实际上,有一个线程池 为请求提供服务。线程被重用于不同的请求。这就是为什么在一个请求的处理完成时无条件地清除 ThreadLocal 至关重要的原因。你应该使用成语 try {} finally { threadLocal.clear(); }

关于java - Thread Local - 我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25200664/

相关文章:

java - 从 src 目录中的类访问 test 目录中的类

java - 以编程方式启用 Spring Security pre-post-annotations

java - 使用有状态 session Bean (EJB)

java - 文件的 WEB-INF 路径

java - 如何通知 Elasticsearch 客户端有新的索引文档?

java - 类构造函数中的堆栈溢出错误

java - 引入一个新变量而不是重复使用参数 "entity"

java - 回滚问题 - Liquibase

java - org.hibernate.LazyInitializationException : failed to lazily initialize a collection of role in another environment

java - Java Servlet 中的内存泄漏