首先我们讲一下,ThreadLocal的作用是什么?我们可以把他理解成一个工具,通过他来帮助我们操作Thread中ThreadLoacalMap,注意哈,我们存的数据是存在Thread中的,不是存在ThreadLocal里面的!!
而为什么需要有这个ThreadLocalMap,是因为我们在线程执行的过程中,希望保存一些内容,我在整个线程的生命周期中,可以很方便的去使用。
这个ThreadLocalMap的内部是一个个的Entry对象,和HahsMap一样。
他的key值就是我们的ThreadLocal,而Value就是我们希望保存的值。
也就是说,ThreadLocalMap其实就是一个kv数组,k是我们的ThreadLocal对象,v是我们的值。
他存在两个内存泄漏点,第一个是key值会泄露,也就是我这个ThreadLocal对象用完了,以后不用了,但是我的线程还没有结束,那么这个ThreadLocal也就不能被回收,他的解决方法是将ThreadLocal对象设置为弱引用对象,也就是触发GC了,就清理。
第二个泄漏点,是value泄漏,当key清理了,那么我如何访问这个v呢?k都没了。特别是在一些线程池的场景中,线程会被反复使用,那么如果这个v没有被清理的话,就会一直保存,造成这个泄漏。解决方案是,ThreadLocal使用完了,就手动remove掉,不要留在那里。