ThreadLocal ThreadLocal 適用於變數線上程間隔離,而在方法或類間共用的場景。 代碼 1 @RestController 2 public class ThreadLocalController { 3 private static final ThreadLocal<Strin ...
ThreadLocal
ThreadLocal 適用於變數線上程間隔離,而在方法或類間共用的場景。
代碼
1 @RestController 2 public class ThreadLocalController { 3 private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null); 4 @GetMapping("bad") 5 public Map doBad(@RequestParam("uid") String uid) { 6 String before = currentUid.get(); 7 currentUid.set(uid); 8 String after = currentUid.get(); 9 Map result = new HashMap(); 10 result.put("before", before); 11 result.put("after", after); 12 return result; 13 } 14 }
在application中做一下tomcat的配置
server.tomcat.max-threads=1
運行結果
第一次
第二次
按理說before總是null才對,為什麼第二次運行卻讀取到了第一次的值呢?
只是因為我們的tocat會開啟一個線程來調用我們的程式,而tomcat本身是有線程池的,會出現線程復用的情況。所以導致了問題。
修複
1 @RestController 2 public class ThreadLocalController { 3 private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null); 4 @GetMapping("good") 5 public Map doGood(@RequestParam("uid") String uid) { 6 7 try { 8 String before = currentUid.get(); 9 currentUid.set(uid); 10 String after = currentUid.get(); 11 Map result = new HashMap(); 12 result.put("before", before); 13 result.put("after", after); 14 return result; 15 } finally { 16 currentUid.remove(); 17 } 18 } 19 }
Key
tomcat線程池。