使用时内存结构
ThreadLocal可以看作一个工具,它自身并不会存储数据而是作为线程ThreadLocalMap的键值来使用;ThreadLocal和ThreadLocalMap共同做到了数据线程独享同时也解决了某些场景下的线程安全问题(例外:ThreadLocalMap中的value如果是静态或者共享数据仍然存在安全问题)。
为什么ThreadLocalMap对引用ThreadLocal是弱引用?
假设我们使用的线程是线程池中的核心线程或者是个常驻线程,在使用完threadlocal后,threadlocal会弹出栈此时threadlocal会销毁吗?答案是当然不会除非线程池或者常驻线程销毁,但是如果改为弱引用,即便threadlocal使用完弹出栈,等到gc时thread local因为时弱引用此时一定会被回收,因此对threadlocal的弱引用是为了避免key的内存泄漏问题。
ThreadLocal之remove函数重要性
虽让key能够回收,那么value呢,value可是强引用。假设在使用线程池并且业务中会平凡的使用ThreadLocal假设有成千上万个,这样就会导致threadlocalmap中的value越来越多可能会导致jvm内存耗尽因为强因为不会被回收,因此在使用完ThreadLocal应该及时的调用remove移除这样gc能收回key和value(如果线程自身及时的销毁可以不掉用)。