我们再线程池中使用ThreadLocal时,一定要区分于多线程使用ThreadLocal这种情况。因为使用线程池时候,线程是有可能被复用的。而线程对象是通过ThreadLocalMap保存了ThreadLocal以及Value。如果不显示的调用ThreadLocal的remove方法,当线程池中的线程被复用时,调用ThreadLocal的get方法,会取出来这个线程上一次调用ThreadLocal的set方法放进去的值。
另外,使用tomcat要注意下,tomcat实际是通过线程池处理请求的,因此在controller层使用ThreadLocal,一定要调用remove方法,否则会出现信息串了情况。参考下面这个文章
在线程池中使用ThreadLocal,你必须要知道这一点 - 知乎
而使用多线程则不会出现这种情况,因为多线程是我们自己定义的线程,不会被复用。