ThreadLocal (中) --- ThreadLocal底层原理、内存泄漏分析

ThreadLocal你了解吗?

ThreadLocal应用场景在什么地方?

ThreadLocal会产生内存泄漏你了解吗?


同一线程中每一层方法必须是同一个connection才能支持事务
在这里插入图片描述
在这里插入图片描述
一个线程往ThreadLocal里面set对象以后,另一个线程get不到这个对象—线程隔离
在这里插入图片描述
ThreadLocal的set方法,ThreadLocalMap中的keythreadLocal的对象本身,value是传进来的参数value:
在这里插入图片描述
在这里插入图片描述
tl.set(new Person()):拿到当前线程,tl作为key,new Person()作为value,放进当前线程特有的map中

具体怎么set的呢:就是new了一个Entry来存
在这里插入图片描述在这里插入图片描述在这里插入图片描述
Entry是WeakReference的子类,构建时调用父类的构造方法;父类构造方法就是new出一个弱引用WR,接着再把k传给它,k就是tl对象;弱引用WR指向tl

------听到了73:44秒,下次继续
在这里插入图片描述
如上图,key指向threadLocal是一个弱引用,这样当tl指向threadLocal的引用被取消时,即tl=null时,只剩下一个key指向threadLocal的弱引用,这样ThreadLocal可以被垃圾回收器回收,key指向的这块threadLocal不会造成内存泄漏

但是
在这里插入图片描述
如上图,当key变成null时,value指向的那一块区域无法被回收,导致内存泄漏

所以,当你不用key,value对的时候,要把它remove掉,防止内存泄漏


threadlocal的get和set方法会先把key为null的清除掉,但是仍然要手动remove掉------因为很多线程经常长时间不执行get和set方法


在这里插入图片描述
如果是线程池的话,线程用完又放回去,threadlocal忘记remove;下次这个线程又被拿出去,又没有清理,又放回去,那么threadlocal对象会越积越多,内存泄漏会越来越严重

猜你喜欢

转载自blog.csdn.net/nikyae/article/details/110913891