美文网首页
ThreadLocal(gold_axe)

ThreadLocal(gold_axe)

作者: 胖达_4b7e | 来源:发表于2019-06-18 02:59 被阅读0次
    ThreadLocal
    ThreadLocal ThreadLocal .ThreadLocalMap

    ThreadLocalMap是Thread里面一个以ThreadLocal为key的map, 因为一个线程可能有多个ThreadLocal

    给ThreadLocal实例set值就是
    threadLocal.currentThread.threadLocalMap.set(threadLocal,value)

    可以看到, ThreadLocal里面只需要一个field(另外一个是辅助的)就是threadLocalHashCode, 用于它在ThreadLocalMap里面当key的时候作为hash码



    ThreadLocal除了一个hash值, 就没其他状态了, 具体的值还是由线程各自保管, ThreadLocal只提供方法

    内存泄漏

    如果 做这样的操作 threadLocal=null
    意图是所有的线程里面都用存以这个theadLocal为key的值了

    用软引用避免的 [threadLocal不能垃圾回收]

    可以看到 ThreadLocalMap的key是一个弱引用,
    这是为了
    如果这个ThreadLocal对象已经没有其他引用指向它了,
    各个线程里面的ThreadLocalMap不会阻止这个ThreadLocal对象的回收,
    就是说, threadLocal=null 这样做的话, 下次垃圾回收会把 threadLocal这个对象回收
    class->threadLocal 这个强引用断了 就能回收了
    线程->map->key----> threadLocal 这个软引用 不会妨碍回收

    还是会泄漏的 value

    虽然如此还是可能发生内存泄漏,
    threadLocal=null 以后
    threadLocal 是能被回收了
    但是
    线程里面那个map的value 还有引用
    线程->ThreadLocalMap的那个原来key是那个threadLocal 的 entity ->里面的value

    ThreadLocal对象作为ThreadLocalMap的key确实回收了,但是它对应的value没有被回收!
    被线程强引用着!
    会一直存在到那个线程结束!
    如果线程在线程池里面就永远不会结束! 永远回收不了这个没有用的value

    避免内存泄漏

    不要 用 threadLocal=null
    threadLocal.remove()一下

    强引用就不会被回收
    没引用的对象回收后,还是不够,就回收软引用
    垃圾回收发送就会被回收
    gc时通知一下

    相关文章

      网友评论

          本文标题:ThreadLocal(gold_axe)

          本文链接:https://www.haomeiwen.com/subject/wbntqctx.html