Java 单线程代码ThreadLocal串值问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值