java面试八股文--ThreadLocal

java面试八股文–ThreadLocal

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

当ThreadLocal往里set值时,其实本质是存在里里面的一个ThreadLocalMap中,而map的key就是ThreadLocal,value就是要存储在线程里的变量,这也就是为什么其他线程调用时,拿不到非本线程的数据的原因;
java面试八股文--ThreadLocal_第1张图片
java面试八股文--ThreadLocal_第2张图片

在我们去看这个map的时候,发现,其实它的key是一个弱引用
java面试八股文--ThreadLocal_第3张图片
java面试八股文--ThreadLocal_第4张图片
此时,就不得不讲一下内存泄露和内存溢出;
内存泄露:内存泄露是指内存中存在GC无法回收的对象,这个对象一直被引用;
内存溢出:是指新的对象进入内存中,但是内存空间已经无法承载此对象进入内存,此时会出现内存溢出的情况;
如果很多情况存在内存泄露,此时就会导致内存溢出的情况;

而ThreadLocal中map涉及key的弱引用就是为了解决内存溢出,当图一中的ThreadLocal强引用不再使用时,此时,ThreadLocal就只存在map涉及的key的弱引用,一但GC过来回收ThreadLocal,发现只涉及弱引用,直接就给干掉了;若在此时变为了强引用,GC就永远无法回收,很多TheadLocal过来之后,就会造成大量的内存泄露,直接导致了内存溢出!

用完ThreadLocal后,一定要调用其remove方法,删除其map里的键值对;

你可能感兴趣的:(java面试八股文,面试,java,jvm)