threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据,使用方法也很简单
static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>(); sThreadLocal.set() sThreadLocal.get()tl.set方法如图
public void set(T value) { Thread t = Thread.currentThread(); /*取得当前线程,获取到当前线程的threadLocals 这里threadLocals的类型是和ThreadLocal 在一个文件中的ThreadLocalMap 类*/ ThreadLocalMap map = getMap(t); if (map != null) //这里的this指的是外面调用set方法的tl 也就是threadLocal map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; } map使用了Entry而 Entry extends WeakReference<ThreadLocal<?>> 继承虚引用的虚引用(每次GC都会被回收)
1 当setDate方法调用后 tl引用 TreadLocal的引用就会消失
2 如果ThreadLocalMap的key引用的TreadLocal 是强引用,TreadLocal不会被GC会导致内存泄漏
3 弱引用后TreadLocal 下次GC就会被回收
4 key为null 会导致value 内存泄漏不会被回收!所以set之后不用了必须要执行remove方法
