ThreadLocalMap是每个线程Thread类里的变量,里面最重要的属性是一个键值对数组Entry[] table,可以认为是一个map,键值对:
- 键:这个ThreadLocal
- 值:实际需要的变量,比如user或者simpleDateFormat
ThreadLocal的get方法
GC回收不了的value
内存泄露:某个对象不再有用,但是占用的内存却不能被回收。
强引用:就是我们声明变量并指向一个对象--Object a = new Object;
什么样的对象会被回收:没有引用关联或者只被弱引用关联。
正常情况下,线程终止,该线程内的所有引用会被置为null,ThreadLocalMap的key和value一个是弱引用,一个是没有引用关联,都可以被垃圾回收。
但是线程不终止(比如线程需要保持很久),那么key对应的value就不能被回收,因为有以下调用链:
调用链
remove方法可以将entry的引用置为null,那么entry整个对象都会被回收,此时对应entry的value没有任何强引用了,也会被回收。
threadlocal的remove()方法
所以我们需要在使用完threadlocal之后,调用remove方法,这也是阿里规约所规定的。
网友评论