问题描述:众所周知,TheadLocal用来实现线程参数隔离,但是在web项目中使用ThreadLocal来维护线程私有变量时,当页面上不同的功能A和B有相同的一段代码,同时这个代码中有ThreadLocal来判断执行的是哪一个功能的时候,会出现干扰的情况。也就是当A设置了一个线程变量执行完后,调用B执行时还是能获取到这个线程变量。
原因分析:照理来说两个功能应该走的是两个不同的线程,不应该出现这个问题的,但是有一点需要注意,那就是Tomcat两次不同的操作可能使用的是同一个线程,原因就是启用了Tomcat的线程。
确定问题:正是由于Tomcat的线程池,造成了线程复用,A和B两个操作用的是同一个线程,所以造成ThreadLocal线程干扰的问题。
解决办法:增加一个过滤器,每次线程执行最开始都remove掉所有的ThreadLocalMap