簡體   English   中英

本地線程-我在做什么錯?

[英]Thread Local - What am I doing wrong?

[IMG] http://i60.tinypic.com/121bww0.jpg [/ IMG](向具有較高代表性的用戶提出請求,請鏈接該圖片,它將支持該問題。)

嗨,圖片顯示了我所理解的Web應用程序流程。 瀏覽器將請求發送到spring調度程序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();
    }

}

發送兩個休息呼叫時,輸出為“ a”,“ a”。 盡管該字符串是線程本地的,但該字符串將追加到同一列表中。

我的理解是,每個http請求(其余調用)都產生一個新線程。 每次調用都通過調用initialize()方法開始。 由於每個請求都是一個新的線程,因此對於每個http請求,threadLocal必須是單獨的,但實際上我是線程正在寫入同一列表。 因此,所有消息都被添加到同一列表中。 僅當兩個調用是同一線程時,才會發生此行為。

謝謝

實際上,有一個服務於請求的線程 線程可重用於不同的請求。 這就是為什么在一個請求的處理完成時無條件清除 ThreadLocal至關重要的原因。 您應該使用慣用語來try {} finally { threadLocal.clear(); } try {} finally { threadLocal.clear(); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM