1、ThreadLocal可以通过为每个线程生成唯一的标识符,用于定位ThreadLocal中每个线程所保存的变量;
public void set(T value) {
//获得当前线程, Thread t = Thread.currentThread();
//通过getMap方法获得实际每个线程自己存储key和value的Entry数组,即ThreadLocalMap变量;
//可以理解为所有线程在TheadLocal中公用一个数组; ThreadLocalMap map = getMap(t); if (map != null)
//this作为key,key通过key.threadLocalHashCode & (len-1);方式获得在数组中位置,
//存在的话,替换value,日过
//不存在的话,在指定数组位置新建Entry变量 map.set(this, value); else
//如果ThreadLocalMap不存在,初始化一个长度为16的数组 createMap(t, value); }
需要重点注意,key是继承了WeakReference的若引用对象,value为强引用对象,因此value有可能一直删除,造成内存泄漏,
为方式value造成的内存泄漏可以,每次使用完remove。
如下代码:
static class Entry extends WeakReference<ThreadLocal> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal k, Object v) { super(k); value = v; } }
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; }
//当前线程存储的值是有可能为null的,即当前线程没有set过值 return setInitialValue(); }