Java 单线程代码ThreadLocal串值问题
2020-04-15 16:07:33来源:博客园 阅读 ()
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资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash