• 多线程002ThreadLocal有哪些内存泄露问题,如何避免


    每个Thread都有一个ThreadLocal.ThreadLocalMap的map,该map的key为ThreadLocal实例,它为一个弱引用。

    弱引用有利于GC回收。

    弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。

    在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

    不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

    当ThreadLocal的key等于null时,GC就会回收这部分空间,但是value却不一定能够被回收,因为他还与Current Thread存在一个强引用关系。

    由于这个强引用关系,会导致value无法回收。

    如果这个线程对象不会销毁,那么这个强引用关系会一直存在,就会出现内存泄露情况。

    所以只要这个线程对象能够及时被GC回收,就不会出现内存泄漏。

    解决办法:

    使用ThreadLocalMap种的setEntry()、getEntry(),遇到key为null的情况,会对value设置为null。

    也可以显式调用ThreadLocal的remove()方法进行处理。

    总结:

    ThreadLocal不是用于解决共享变量的问题的,也不是为了协调线程同步的,而是为了方便每个线程处理自己的状态而引入的一个机制。

    每个Thread内部都有一个ThreadLocal.ThreadLocalMap类型的成员变量,该成员变量用来存储实际的ThreadLocal变量副本。

    ThreadLocal并不是为线程保存对象的副本,它仅仅起到一个索引的作用。它的主要目的是为每一个线程隔离一个类的实例,这个实例的作用范围仅限于线程内部。

  • 相关阅读:
    伪静态常用配置方法
    vue移动端选择日期,星期,时间控件
    didact笔记
    OpenSSL 安装与配置(转)
    2、Servlet系列jsp
    24、lambda表达式
    20、File类、io流(字节流\字符流\输入流\输出流\标准输入\标准输出\打印流)
    17、集合框架_HashSet\TreeSet\比较器\泛型
    23、网络编程 IP、TCP、UDP
    21、多线程(线程与进程\线程的实现方式\线程的声明周期\线程同步与死锁\生产者消费者问题)
  • 原文地址:https://www.cnblogs.com/asenyang/p/15565395.html
Copyright © 2020-2023  润新知