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

ThreadLocal可以简单理解为key为当前Thread的一个Map(简单这么理解(是简单这么理解,实际并不是),具体可参看:https://blog.csdn.net/baichoufei90/article/details/84072355),所以它和线程池一起使用的时候就会出现问题了,因为我们知道线程池有一个好处就是会让线程重用,避免创建过多的线程对象。也就是说有可能会出现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一下就好了。

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值