ThreadLocal原理以及内存泄露问题

1、ThreadLocal实现原理

1、每个线程中有一个ThreadLocalsMap,这是一个哈希表的结构里面有很多entry(也就是k-v),当我们使用ThreadLocal进行set值的时候,会将这个threadLocal设置为key,然后值设置为value放入ThreadLocalsMap,key为弱引用,value为强引用。

ThreadLocal原理以及内存泄露问题_第1张图片

2、TheadLocal内存泄露问题

下面说一下ThreadLocal内存泄露的问题

前提:在栈中我们所有的实例都是堆中实际实例的引用

1、Entry只所以设置成弱引用,就是为了防止key也就是Threadlocal的引用丢失导致内存泄漏,设置成软引用就可以在GC时直接给回收掉。

2、当我们的ThreadLocal被回收掉后,那我们的Value还在内存中,如果是普通线程随着弹栈也就结束了没有问题,如果是线程池的话,这个Value就会一直堆积在内存中就导致了内存泄露。所以我们必须使用remove方法进行及时移除。

你可能感兴趣的:(java,开发语言)