Java单线程ThreadLocal串值问题解决方案
ThreadLocal
ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。
代码
@RestControllerpublic class ThreadLocalController { private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null); @GetMapping('bad') public Map doBad(@RequestParam('uid') String uid) { String before = currentUid.get(); currentUid.set(uid); String after = currentUid.get(); Map result = new HashMap(); result.put('before', before); result.put('after', after); return result; }}
在application中做一下tomcat的配置
server.tomcat.max-threads=1
运行结果第一次

第二次

按理说before总是null才对,为什么第二次运行却读取到了第一次的值呢?
只是因为我们的tocat会开启一个线程来调用我们的程序,而tomcat本身是有线程池的,会出现线程复用的情况。所以导致了问题。
修复
@RestControllerpublic class ThreadLocalController { private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null); @GetMapping('good') public Map doGood(@RequestParam('uid') String uid) { try { String before = currentUid.get(); currentUid.set(uid); String after = currentUid.get(); Map result = new HashMap(); result.put('before', before); result.put('after', after); return result; } finally { currentUid.remove(); } }}
Key
tomcat线程池。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。
相关文章:
1. 一文读懂Spring Cloud-Hystrix2. Vue项目中数据的深度监听或对象属性的监听实例3. bootstrap select2 动态从后台Ajax动态获取数据的代码4. 你好,JOGL - Java与OpenGl的绑定5. python pytesseract库的实例用法6. Javascript如何递归遍历本地文件夹7. python Selenium 库的使用技巧8. Java 汇编JVM编写jasmin程序的操作方法9. SQL+HTML+PHP 一个简单论坛网站的综合开发案例(注册、登录、注销、修改信息、留言等)10. 浅谈由position属性引申的css进阶讨论

网公网安备