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 资源真的是我的工作吗?