关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

云南大王-Java 单线程代码ThreadLocal串值问题

发布时间:2020-04-16 00:00:00
ThreadLocal ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。 代码 1 @RestController 2 public class ThreadLocalController { 3 private static final ThreadLocal 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 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线程池。

/template/Home/Zkeys/PC/Static