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

Posted 有梦就能实现

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadLocal遇到线程池时, 各线程间的数据会互相干扰, 串来串去相关的知识,希望对你有一定的参考价值。

最近遇到一个比较隐蔽而又简单地问题,在使用ThreadLocal时发现出现多个线程中值串来串去,排查一番,确定问题为线程池的问题,线程池中的线程是会重复利用的,而ThreadLocal是用线程来做Key的所以在使用线程池的时候要特别注意ThreadLocal. 
ThreadLocal数据是在线程创建时绑定在线程上的, 所以解决方法是在使用数据之前调用remove() 移除掉之前的其他线程产生的数据

解决方法

重构remove方法 
@Override 
public void remove() { 
super.remove(); 
initialValue(); 

先remove, 然后再初始化一次, 这样就可以保证数据是干净的了.

当然你也可以在调用的finally里面使用remove, 也是可以的.

以上是关于ThreadLocal遇到线程池时, 各线程间的数据会互相干扰, 串来串去的主要内容,如果未能解决你的问题,请参考以下文章

当类暴露于线程池时,清理 ThreadLocal 资源真的是我的工作吗?

面试官:ThreadLocal 搭配线程池时为什么会造成内存泄漏?

使用线程池时,多线程之间上下文参数传递失效解决办法

使用线程池时,多线程之间上下文参数传递失效解决办法

干货|最新各大公司Java后端开发面试题总结

随笔16 ThreadLocal类