ThreadLocalMap中使⽤的keyThreadLocal的弱引⽤,⽽value是强引⽤。所以,如果ThreadLocal没有被外部强引⽤的情况下,在垃圾回收的时候,key会被清理掉,⽽value不会被清理掉。这样⼀ 来,ThreadLocalMap中就会出现keynullEntry。假如我们不做任何措施的话,value永远⽆法被 GC 回收,这个时候就可能会产⽣内存泄露。ThreadLocalMap实现中已经考虑了这种情况,在调⽤set()get()remove()⽅法的时候,会清理掉keynull的记录。使⽤完ThreadLocal⽅法后 最好⼿动调⽤remove()⽅法

static class Entry extends WeakReference < ThreadLocal << ? >> {
    /** The value associated with this ThreadLocal. */
    Object value;
    Entry(ThreadLocal << ? > k, Object v) {
        super(k);
        value = v;
    }
}

弱引⽤介绍:

如果⼀个对象只具有弱引⽤,那就类似于可有可⽆的⽣活⽤品。弱引⽤与软引⽤的区别在于:只具有弱引⽤的对象拥有更短暂的⽣命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,⼀旦发现了只具有弱引⽤的对象,不管当前内存空间⾜够与否,都会回收它的内存。不过,由于垃圾回收器是⼀个优先级很低的线程, 因此不⼀定会很快发现那些只具有弱引⽤的对象。弱引⽤可以和⼀个引⽤队列(ReferenceQueue)联合使⽤,如果弱引⽤所引⽤的对象被垃圾回收,Java 虚拟机就会把这个弱引⽤加⼊到与之关联的引⽤队列中。

最后修改日期: 2021年11月29日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。