ThreadLocal和线程池使用要注意的一个地方
2018-03-30 09:32
369 查看
ThreadLocal可以简单理解为key为当前Thread的一个Map,所以它和线程池一起使用的时候就会出现问题了,因为我们知道线程池有一个好处就是会让线程重用,避免创建过多的线程对象。也就是说有可能会出现ThreadLocal中的线程对象相同的情况,先上代码看看,代码也很简单:
输出结果:
当前线程还没有给ThreadLocal赋值,但是ThreadLocal里面已经有值了。
解决办法可以看ThreadLocal的API:
只要在使用ThreadLocal之前或者之后remove一下就好了。
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一下就好了。
相关文章推荐
- 使用 AfxBeginThread 传递一个结构体入线程需要注意的地方
- Cocos2D中Node的userObject实例变量使用时一个要注意的地方
- UNION 与LIMIT 结合使用时应该注意的一个地方
- 在线程池(ExecutorService)中使用Threadlocal时,需要注意他的复位操作
- Cocos2D中Node的userObject实例变量使用时一个要注意的地方
- 线程池 Threadlocal 使用注意
- QtCreator使用时需要注意的一个地方。
- 使用proxool一个非常值得注意的地方
- Threadlocal的几种误区(尤其线程池中使用时注意)
- (TIP)service使用process类调用bat文件时应该注意的一个地方
- (转载)Threadlocal的几种误区(尤其线程池中使用时注意)
- 从头认识多线程-4.3 ThreadLocal使用时需要注意的地方
- 在使用线程池时应特别注意对ThreadLocal的使用
- Delphi - 使用字符串时,一个注意地方
- Cocos2D中Node的userObject实例变量使用时一个要注意的地方
- 使用 AfxBeginThread 传递一个结构体入线程需要注意的地方
- 在使用线程池时应特别注意对ThreadLocal的使用
- 一个ajax的公共类以及他的使用方式和应该注意的地方
- javascript读书笔记2----使用原型进行扩展的一个需要注意的地方
- 使用boost::asio需要注意的一个地方