ThreadLocal遇到线程池时, 各线程间的数据会互相干扰

1、问题现象

在一个服务中,我们为了不修改接口,且能在当前线程传递数据,想到了用ThreadLocal保存数据, 测试环境一切正常, 上生产环境后发现,当前线程去ThreadLocal保存的用户数据的时候,莫名其妙的取到了,其它用户的数据。

2、问题原因

首先我排查了ThreadLocal 中存、取数据的过程,没有线程安全的问题, 然后怀疑是项目中用了线程池复用线程导致数据混乱,排查后发现项目中并没使用线程池。 然后继续排查发现 Tomcat 中采用线程池技术导致的,当前线程ThreadLocal数据未释放的时候,又被其它请求复用了,从而导致ThreadLocal数据混乱。
下图为tomcat配合线程池内容:
在这里插入图片描述

3、解决方案

1)在每次使用ThreadLocal来进行存储数据的时候,先进行赋值操作,即是校验或者其他操作没有成功,最起码需要一个默认的赋值。记得在使用的时候进行判断。
2)可以在调用的finally里面使用remove。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章