Java 单线程代码ThreadLocal串值问题

2020-04-15 16:07:33来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Java 单线程代码ThreadLocal串值问题

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线程池。


原文链接:https://www.cnblogs.com/Brake/p/12694666.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:哥们面某大厂被拒后,潜心整理了一套面试题(Java岗)

下一篇:面试时你被提过哪些问题下面copy些我觉得经典全面的java面试问题