value的泄漏
    ThreadLocalMap的每个Entry都是一个对key的弱引用,同时,每个Entry都包含了一个对value的强引用;
    正常情况下,当线程终止,保存在ThreadLocal里的value会被垃圾回收,因为没有任何强引用;
    但是,如果线程不终止(比如线程需要保持h很久),那么key对应的value就不能被回收,
    因为有以下的调用链:Thread -> ThreadLocalMap -> Entry(key为null) -> Value

    因为value和Thread之间还存在这个强引用链路,所以导致value无法回收,就可能会出现OOM;
    JDK已经考虑到这个问题,所以在set,remove,rehash方法中会扫描到key为null的entry,并把对应的value设置为null,这样value对应就可以被回收,但是如果一个ThreadLocal不被使用,那么实际上set,remove,rehash方法也不会被调用,如果同时线程又不停止,那么调用链就一直存在,那么就导致value的内存泄漏

    如何避免内存泄漏
    调用remove方法,就会删除对应的Entry对象,可以避免内存泄漏,所以使用完ThreadLocal之后,应该主动调用remove方法