问题描述:我的项目是java web项目,使用ThreadLocal用于存储关于用户相关性信息,但是发现有出现混乱的情况。明明不是这个用户的数据,出现在了这个用户这里。而且我还在每次请求之后的aspect切面,的finally语句块中使用ThreadLocal的remove方法来清除ThreadLocal中存储的数据。
上面的问题查找了很久:发现了以下
1、ThreadLocal简单说明。ThreadLocal是线程本地存储,数据主要存储在ThreadLocalMap当中,线程内变量的值是可以共享的,其他线程不能拿到该线程ThreadLocalMap中的值。而且ThreadLocalMap的生存期和线程的生存期是一样的。
2、tomcat中是使用线程池的,一次请求完了之后不会消除掉这个线程,而是又回到线程池当中可供其他请求来使用。那么即使调用remove方法也不能把数据清除掉。
查看tomcat的相关线程池的信息。
linux服务器:tomcat的conf/server.xml 文件中
其中maxThreads表示线程池中最大的线程数,minSpareThreads表示线程池中最小的空闲线程数,maxSpareThreads表示线程池中最大的空闲线程数。 简单说来:线程池中最多有800个线程在工作,当请求数少的时候,至少有100个空闲的。
不同的服务器的配置不同,我这里只是一个demo说明。
---------------------------------接来下,重点来了ÿ