ThreadLocal 保存线程变量,保证了每个线程的变量不会相互干扰。
底层实现
ThreadLocal的底层是通过 ThreadLocalMap实现的,每个线程变量都有自己的 ThreadLoalMap变量。
而 ThreadLocalMap又由 Entry组成,其中 key 为 ThreadLocal,并且呗定义为为了弱引用, value是具体的值。
所以 ThreadLocal本身并不存储值,它只是作为一个引用
内存泄露的问题
因为 ThreadLocalMap是由 Entry组成的,Entry中的 key 被定义为了弱引用,导致了 key 在垃圾回收时会被清理掉,而 value 并不会,这些无法被清理的 value 会随着线程存活而逐渐累积,造成内存泄露,甚至引发内存溢出。所以在使用 ThreadLocal时,使用完成后,要及时调用清理方法 remove()
父子线程之间的参数传递
ThreadLocal 的变量只能在当前线程中获取,并不能在子线程中获取,如果想在子线程中获取到父线程都变量可以通过 InheritableThreadLocal 实现
InheritableThreadLocal 被创建后会从复制父线程 ThreadLocalMap中的值,从而可以在子线程中使用父线程的值

被折叠的 条评论
为什么被折叠?



