一个http请求到tomcat,tomcat会从线程池里取出一个线程分配给此请求。
请求到webservice(即线程到webservice),从当前线程里取出ThreadLocalMap<ThreadLocal,value>集合(每个线程都拥有一个属于自己的ThreadLocalMap),以ThreadLocal为key可以get和set值(value)
线程结束时,正常情况会清除当前线程里的ThreadLocalMap,但因种种原因可能扩大了ThreadLocal对象的生命周期,线程结束前不一定会清除掉当前线程的ThreadLocalMap。
tomcat线程池里线程数量不是无限的,所以会出现线程复用。当一个新请求来了,复用了上面的线程,因上面请求的ThreadLocalMap还在,遗留下来了里面的ThreadLocal,所以现在的请求一开始就有一个旧的ThreadLocalMap,这个ThreadLocalMap里存留下旧的ThreadLocal。
处理方式:在每一次请求结束时,主动从ThreadLocalMap里remove()掉ThreadLocal,让以后复用线程的请求在一开始自己去新增属于自己的ThreadLocal到ThreadLocalMap里,避免数据混淆。