ThreadLocal线程本地变量
示例:
public class ThreadLocalTest {
private ThreadLocal<String> local = new ThreadLocal<>();
public static void main(String[] args) {
ThreadLocalTest test = new ThreadLocalTest();
test.local.set("zhangsan");
System.out.println(test.local.get());
}
}
Thread、ThreadLocal引用关系图:
当本地引用回收后,Entry对象的key还有引用,不会被回收,若ThreadLocalMap使用强引用,Entry对象只有在当前线程结束的时候才能被回收。此时对象既不能访问且回收不掉,造成了内存泄漏。所以当前使用弱引用,当下一次gc的时候会回收掉key。gc后,key为null,value还存在。当调用ThreadLocal中的set(),get(),remove()时,会清理掉为key为null的对象。最好还是手动调用remove()方法主动清理掉。