ThreadLocal( 副本创建 )容易导致内存泄漏

线程局部对象,每个线程都拥有一个局部线程对象。

如下程序输出结果为 null 为什么呢 因为下面程序中并没有能够造成下列程序的一线程并没有创建出自己的特有对象

 

ThreadLocal( 副本创建 )容易导致内存泄漏

ThreadLocal( 副本创建 )容易导致内存泄漏

之前的 ThreadLocal 的使用方法

方法有 threadlocal.get();threadlocak.set();

ThreadLocal( 副本创建 )容易导致内存泄漏

如何为每一个线程去创建 我们的 threadLocal 呢 因为 在我们的每一个线程当中 都会有这么一个 threadLocals 然后我们调用 set的方法的时候 ,还会去调用 ThreadLocalMap 中的 setInitValue 函数进行返回我们想要的数据。如果 我们线程中的为空 那么他会去创建。

 

泄露的原因呢 就是因为 我们不是创建了一个 threadLocal 吗 然后我们在为每一个线程创建一个副本 threadLocal ,而我们存储这个的是一个ThreadLocalMap 他其中的key 是一个弱引用的 ,这样我们每当这个 threadlocal 没有了 一个外来的强饮用的时候,那就有可能被回收 ,导致我们的 hashmap 的key 值 变成了为空,就会导致我们的内存泄露。

但是我们为什么不使用强引用来使用我们的呢 原因就是我们外界的 threadlocal 一旦被回收 就会导致直接内存泄露 。

我们使用弱引用 我们可以用 threadLocal。remove 或者 set 或者 get 方法 来进行设置 就会清除那些 key 为空的 value 值。

 

注意的一个方法就是使用完 ThreadLocal后要执行 threadlocal.remove 方法这样就会清除掉 entry 中的key 和 value 方法

https://www.cnblogs.com/waterystone/p/6612202.html

http://www.cnblogs.com/dolphin0520/p/3920407.html

http://www.importnew.com/22039.html

推荐:

https://blog.csdn.net/gdhgr/article/details/80450921