java web项目使用ThreadLocal 的坑、注意事项以及是否会内存泄漏

好多人都认为web项目每次请求都会占用一个线程,但是我们要知道这个线程不一定是新的,可能是从tomcat线程池里获取的。

tomcat启动的时候会创建一个线程池,配置如下

这里说一下为什么 如果在web项目中,使用 ThreadLocal 不当,会造成 OutOfMemoryError。 
如果调用 ThreadLocal 的 set 方法 将一个对象放入Thread中的成员变量threadLocals 中,那么这个对象是永远不会被回收的,因为这个对象永远都被Thread中的成员变量threadLocals引用这。

如果想让垃圾收集器回收它,有两种方法 
1:将该线程从tomcat线程池中去除,当一个线程被回收的时候何况它的成员变量呢,但是tomcat启动一般都会配置一个线程池进行优化,所有该方法不太现实。 
2:调用 ThreadLocal 的 remove 方法 将对象从hread中的成员变量threadLocals 中删除掉。

设想如果将一个大对象放入threadLocals 中,并且还没有remove。那么就可能会造成OutOfMemoryError,如果不会造成OutOfMemoryError那么也很浪费java堆内存
 

所以,我们在web项目中使用threadLocals一定要调用remove方法

(我使用threadLocals 在本线程中传参数)

你可能感兴趣的:(多线程)