码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-11-24 00:11:04      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:init   over   比较   重复   多个   nbsp   err   问题   finally   

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

解决方法

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

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

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

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

标签:init   over   比较   重复   多个   nbsp   err   问题   finally   

原文地址:http://www.cnblogs.com/firstdream/p/7886460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!