Threadlocal是 java 提供的线程本地存储机制,可以利用该机制将数据缓存在 某个线程内部,任意方法中获取缓存的数据;
Threadlocal 是通过 ThreadlocalMap来实现的,每个 Thread对象(注意:不是Threadlocal对象)中都存在一个 ThreadlocalMap,map的 key为Threadlocal对象,map的值为需要缓存的值;


如果在线程池中使用 Threadlocal会造成内存泄漏,因为当Threadlocal使用完后,应该把设置的 key,value,也就是 Entry进行回收,但线程池中的线程不会回收(线程池中核心线程不会消亡会一直存在),而线程对象是通过强引用指向 ThreadlocalMap的,ThreadlocalMap对象也是通过强引用指向 Entry的,Entry对象也就不会回收,从而出现内存泄漏;
解决的办法是在 使用 Threadlocal对象后,手动调用 Threadlocal的 remove()方法,手动清除 Entry对象;

Threadlocal的经典场景就是连接管理,一个线程持有一个连接,该连接可以在不同的方法之间进行传递,线程之间不共享同一个连接;
ThreadLocal是Java提供的线程本地存储机制,每个线程内部通过ThreadLocalMap保存数据。然而,在线程池中使用ThreadLocal可能导致内存泄漏,因为线程不会回收ThreadLocalMap中的Entry对象,造成强引用链无法被垃圾回收。解决办法是使用后调用ThreadLocal的remove()方法清除。ThreadLocal的经典应用场景包括连接管理,确保线程间独立的连接实例。
1416

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



