java-ThreadLocal内存泄露的本质是没有删除数据

必须final吗?为什么?

不是必须。但是也可以final,而且最好final,因为ThreadLocal本身只被赋值一次——但是ThreadLocal的数据是会改变的。

jdk api说明建议是private static,为什么?因为ThreadLocal是属于当前请求线程的,也就是属于类的,而不是属于对象的,所以是static。

生命周期

每个请求线程有自己的数据

一般是请求刚进来的地方,会写数据到线程上下文。然后,后面当前请求线程的整个链路就都可以读该数据。

当前请求线程结束的时候,必须要删除数据

为什么要删除?避免内存泄露?是的。如果不删除的话,当前请求线程的数据可能会越来越多,最终导致内存泄露。所以用ThreadLocal的时候,必须在当前请求线程结束的时候,删除数据。

为什么不删除,就会内存泄露?因为当前请求线程是会被web服务器的线程池复用的,如果当前请求线程的数据每次不删除,那么线程的数据可能会越来越多。

猜你喜欢

转载自juejin.im/post/7019550419089096717