ThreadLocal
① 预备知识
Java中的4种引用类型:强软弱虚
弱引用:GC看到会直接回收;主要用于一次性使用的场合,使用完就不要了;
虚引用:用于管理堆外内存;
② ThreadLocal
ThreadLocal是每个线程自己独立拥有,线程存在,这个ThreadLocal对象就一直存在;
ThreadLocal可以简单理解为是一个容器,容器内可以装一堆对象;
2.1 ThreadLocal源码解读:
- 1 任何一个new出来的Thread线程对象,它创建了一个map(key,value);
- 2 new一个ThreadLocal对象,让其调用自己的set方法,就是把自己放到了上述的map中,作为key,set进来的对象作为value;
tl作为map中的key,Person对象作为map中的value;
- 3 tl调用自己的set方法将自己放入map中;set方法内部实现:调用map.set(),set方法会设置一个<key,value>对传进去,这个key value对会被new成一个Entry(一个Entry就是map中的一行,也就是一对<key,value>),而Entry 继承了WeakReference(弱引用类);
2.2 面试题
问题一:为什么要使用弱引用让key指向ThreadLocal?
- 防止内存泄漏。当tl一旦没有的时候,由于key指向TL是弱引用,可以被GC回收(弱引用一遇到GC就会被回收);如果key指向TL是强引用,则不会被GC回收。
问题二:结合问题一,当TL被删除以后,map中的key就指向null了,也就是说这条<key,value>记录没有用了,需要被删除,但是还有一条强引用指向他,无法自动删除,怎么办?
- 需要手动调用remove()方法删除,避免内存泄漏。
PS:内存泄漏和内存溢出
-
内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
-
内存泄漏 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
- memory leak会最终会导致out of memory!
来源:oschina
链接:https://my.oschina.net/u/4419899/blog/4348014