Тема Local - Что я делаю не так?

1

[IMG] http://i60.tinypic.com/121bww0.jpg[/IMG] (просьба к высокопоставленному пользователю, пожалуйста, ссылку на изображение, это будет поддерживать вопрос.)

Привет, На изображении изображен поток веб-приложений, как я понимаю. Браузер отправляет запрос сервлете диспетчера весны. Сервлет порождает новый поток для каждого запроса (я предполагаю, что он делает это по умолчанию. Я не знаю, как это контролируется.) Код выглядит следующим образом:

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();
    }

}

При отправке двух вызовов отдыха выход "a", "a". строка получает добавление к тому же списку, несмотря на то, что она является локальной.

Я понимаю, что каждый HTTP-запрос (вызов для отдыха) порождает новый поток. Каждый вызов начинается с вызова метода initialize(). Поскольку каждый запрос представляет собой новый поток, threadLocal должен быть отдельным для каждого HTTP-запроса, но практически я потоки записывают в тот же список. Таким образом, все сообщения добавляются в один список. Такое поведение может произойти только в том случае, если оба вызова являются одним и тем же потоком.

благодаря

Теги:
servlets
spring
httprequest
thread-local

1 ответ

6
Лучший ответ

На самом деле существует пул потоков, обслуживающих запросы. Потоки используются повторно для разных запросов. Вот почему важно безоговорочно очистить ThreadLocal при завершении обработки одного запроса. Вы должны сделать это, используя idiom try {} finally { threadLocal.clear(); } try {} finally { threadLocal.clear(); }

  • 0
    +1 очень полезно :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню