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线程池。
深圳网站建设www.sz886.com