[英]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.