ThreadLocal

被刻印的时光 ゝ 提交于 2020-08-06 10:16:19

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!

     

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!