首页 > 其他分享 >使用ThreadLocal请务必remove

使用ThreadLocal请务必remove

时间:2023-04-15 23:14:58浏览次数:27  
标签:务必 请求 Thread remove ThreadLocal 线程 使用

原文地址:https://www.cnblogs.com/panchanggui/p/15105419.html

特别注意,web容器的线程是重复使用的,web容器使用了线程池,当一个请求使用完某个线程,该线程会放回线程池被其它请求使用,这就导致一个问题,不同的请求还是有可能会使用到同一个线程(只要请求数量大于线程数量),而ThreadLocal是属于线程的,

如果我们使用完ThreadLocal对象而没有手动删掉,那么后面的请求就有机会使用到被使用过的ThreadLocal对象!

这时候分情况考虑了:

1此请求在使用ThreadLocal的时候,是先get()来判断然后再set(),那就会有问题。因为get到的是别的请求set的内容,

2此请求在使用ThreadLocal,都是先set再get,那就不会有问题,因为一个线程同一时刻只被一个请求使用,只要我们每次使用之前,都设置成自己想要的内容,那就不会在使用的过程中被覆盖。

使用ThreadLocal最好是每次使用完就调用remove方法,将其删掉,避免先get后set的情况导致业务的错误。

 

第二点,不remove的话容易造成堆栈内存溢出。

 

线程池重用线程时,会对ThreadLocal的值进行清空吗?

 

 

《Java并发编程实战》一书的第8章时,有如下一句话:

 

只有当线程本地值的生命周期受限于任务的生命周期时,在线程池的线程中使用ThreadLocal才有意义,而在线程池的线程中不应该使用ThreadLocal在任务之间传递值。

 

------------

不会清空,要你自己去清空。

ask指的是一个Thread所执行的任务。

总之就是告诉你,如果你能够在使用ThreadLocal的时候管理它的创建、销毁,那么就可以用,否则会出问题。原因是ThreadLocal是和Thread绑定的,如果Thread是从Thread Pool中拿出来的,那么意味着Thread可能会被复用,如果被复用,你就一定得保证这个Thread上一次结束的时候,其关联的ThreadLocal被清空掉,否则就会串到下一次使用。

标签:务必,请求,Thread,remove,ThreadLocal,线程,使用
From: https://www.cnblogs.com/eyesfree/p/17322195.html

相关文章

  • ThreadLocal 简单介绍
    目录一、什么是ThreadLocal?二、ThreadLocal如何使用?三、ThreadLocal的实现原理是什么?1、set()方法2、ThreadLocalMap3、get()方法4、remove()方法5、总结四、ThreadLocal数据共享五、ThreadLocal在Java中的应用场景有哪些?六、常见问题1、Entry的key为什么设计成弱引用?2、ThreadLo......
  • ThreadLocal
    ThreadLocal介绍ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来......
  • Java中ThreadLocal的用法和原理
    用法隔离各个线程间的数据避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal中管理的对象。packagecom.example.test1.service;importorg.springframework.scheduling.annotation.Async;importorg.springframework.stereotype.Component;imp......
  • ThreadLocal原理探究
    四大引用是什么,分别有什么特点:1强引用、软引用、弱引用、虚引用强引用:发生gc的时候,只要对象还有引用,就不会被回收软引用:发生gc的时候,内存够用就不会回收,内存不够时,就会回收。可以及时的避免oom。Map<String,SoftReference<BitMap>>imageCache=newHashMap<Str......
  • 不要直接运行yum remove!
    yuminstall是安装软件,对应的yumremove是卸载软件,但是如果你对于yumremove也回答yes的话,很可能会把系统搞崩溃的。比如:安装和卸载nginx使用yuminstallnginx安装了nginx,这是如果直接使用yumremovenginx的话,会把依赖的一些包也删掉。所以要使用rpm-e--nodepsnginx这......
  • MFC-RemoveProp删除窗口属性
     HANDLEh=::RemoveProp(m_hWnd,g_szPropName);//删除窗口属性/*从窗口属性表中删除一个属性参数1:HWNDhWnd窗口的句柄参数2:LPCTSTRlpString要删除的属性返回值:成功返回属性的数据;失败返回值为NULL*/     ......
  • ThreadLocal
    什么是ThreadLocalThreadLocal提供了线程局部变量.这些变量和正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候都有自己独立的变量副本.ThreadLocal实例通常是类的私有静态字段,使用它的目的是希望将状态(用户ID、事务ID)与线程关联起来通俗易懂:实现每一个线......
  • c#: AsyncLocal的使用,对比ThreadLocal
    一、先说ThreadLocal在以前写代码的时候,还没有异步的概念,那个时候我们处理HTTP请求就只用一个线程就搞定了,有的时候我们想在代码中共享一个对象,我们希望将这个对象绑定到线程上。如下:classProgram{privatestaticThreadLocal<WebContext>threadLocal=newThreadLoca......
  • foreach/增强for循环 中 使用iterator.remove();
    Set<String>set=newHashSet<>();set.add("a");set.add("b");Iterator<String>iterator=set.iterator();for(Stringstring:set){iterator.next();iterator.remove();} Excep......
  • ThreadLocal缺点及解决方案
    简单的一句话总结是每个Thread上都有一个threadLocals属性,它是一个ThreadLocalMap,里面存放着一个Entry数组,key是ThreadLocal类型的弱引用,value是对用的值。所有的操作都是基于这个ThreadLocalMap操作的。但是它有一个局限性,就是不能在父子线程之间传递。即在子线程中无法访问在父......