原文:blog.csdn.net/qunqunstyle99/article/details/94717256什么是ThreadLocalThreadLocal是一个本地线程拷贝变量的工具类。主要用于在私有线程和线程中存储的复制对象之间做一个映射。每个线程之间的变量互不干扰。在高并发场景下,可以实现无状态调用,特别适合各个线程不依赖的变量值。动作完成的场景。下图是ThreadLocal的内部结构图从上面的结构图中,我们窥见了ThreadLocal的核心机制:每个Thread线程内部都有一个Map。Map中存放的是线程本地对象(key)和线程的变量副本(value)。但是Thread内部的Map是由ThreadLocal维护的,ThreadLocal负责获取线程的变量值,并将其设置到map中。因此,对于不同的线程,每次获取副本值时,其他线程无法获取当前线程的副本值,形成了副本的隔离,互不干扰。推荐一个开源免费的SpringBoot最全教程:https://github.com/javastacks/spring-boot-best-practiceThreadLocalMapThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,实现了Map中的功能一个独立的方式。内部的Entry也是独立实现的。与HashMap最大的区别在于ThreadLocalMap的结构非常简单,没有next引用。也就是说,ThreadLocalMap中解决Hash冲突的方式不是链表的方式,而是线性检测的方式。(ThreadLocalMap是如何解决冲突的?)在ThreadLocalMap中,Entry也是用来保存K-V结构数据的。但是Entry中的key只能是ThreadLocal对象,已经被Entry的构造方法限制了。staticclassEntryextendsWeakReference{/**与此ThreadLocal关联的值。*/对象值;条目(ThreadLocalk,对象v){超级(k);值=v;}}注意力!!Entry继承自WeakReference(弱引用,生命周期只能存活到下一次GC),但只有Key是弱引用类型,Value不是弱引用。(问题很快就来了)因为ThreadLocalMap的key是弱引用,而Value是强引用。这导致了一个问题。当ThreadLocal没有对外部对象的强引用时,弱引用Key在GC发生时会被回收,但Value不会被回收。当线程没有终止,但是ThreadLocal已经被回收时,可能会导致线程中出现ThreadLocalMap键值对,从而导致内存泄漏。(ThreadLocal被回收了,ThreadLocal关联的线程共享变量依然存在)。如何避免泄密为了防止出现这种情况,我们有两种手段。1、使用线程共享变量后,调用ThreadLocalMap.remove方法清除线程共享变量;由于Key是弱引用,我们要做的就是在完成之前调用ThreadLocal的get()和set()方法调用remove方法,解除Entry节点和Map之间的引用关系,这样整个入口对象经过GCRoots分析后变得不可达,可以在下一次GC中回收。2、JDK建议将ThreadLocal定义为privatestatic,这样就不存在ThreadLocal的弱引用问题。文章参考:www.jianshu.com/p/98b68c97df9bwww.cnblogs.com/coshaho/p/5127135.html近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.惊艳!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!