您的位置:首页 > 其它

ThreadLocal和线程池使用要注意的一个地方

2018-03-30 09:32 369 查看
ThreadLocal可以简单理解为key为当前Thread的一个Map,所以它和线程池一起使用的时候就会出现问题了,因为我们知道线程池有一个好处就是会让线程重用,避免创建过多的线程对象。也就是说有可能会出现ThreadLocal中的线程对象相同的情况,先上代码看看,代码也很简单:

public class ThreadTest {

static ExecutorService defaultFixedExecutor = Executors.newFixedThreadPool(1);
static ThreadLocal<String> threadLocal = new ThreadLocal<String>();

public static void main(String[] args) {
for (int i = 1; i < 4; i++) {
final int count = i;
defaultFixedExecutor.submit(new Runnable() {

@Override
public void run() {
System.out.println("第"+count+"次循环刚开始,ThreadLocal中的值为:"+threadLocal.get());
threadLocal.set(count+"---");
System.out.println("第"+count+"次循环结束,ThreadLocal中的值为:"+threadLocal.get());
System.out.println("当前线程名称为:"+Thread.currentThread().getName());
System.out.println("------------------");
}
});

}
}
}

输出结果:



当前线程还没有给ThreadLocal赋值,但是ThreadLocal里面已经有值了。

解决办法可以看ThreadLocal的API:



只要在使用ThreadLocal之前或者之后remove一下就好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: