使用ThreadLocal请务必remove

特别注意,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在任务之间传递值。

Original: https://www.cnblogs.com/panchanggui/p/15105419.html
Author: panchanggui
Title: 使用ThreadLocal请务必remove

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/552906/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球