09ThreadLocal每次请求后被gc掉了,为什么还能请求到上一个用户信息?
1当使用ThreadLocal保存一个value时,会在ThreadLocalMap中的数组插入一个Entry对象,按理说key-value都应该以强引用保存在Entry对象中,但在ThreadLocalMap的实现中,key被保存到了弱引用对象中。这就导致了一个问题,ThreadLocal在没有外部强引用时,发生GC时会被回收,如果创建ThreadLocal的线程一直持续运行,那么这个Entry对象中的value就有可能一直得不到回收,发生内存泄露。2为什么key要用弱引用?事实上,在ThreadLocalMap中的set/getEntry方法中,会对key为null(也即是ThreadLocal为null)进行判断,如果为null的话,那么会把value置为null的.这就意味着使用threadLocal,CurrentThread依然运行的前提下.就算忘记调用remove方法,弱引用比强引用可以多一层保障:弱引用的ThreadLocal会被回收.对应value在下一次ThreadLocaI调用get()/set()/remove()中的任一方法的时候会被清除,从而避免内存泄漏
来自:并发和同步-ThreadLocal