ThreadLocal源码
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();
}
收藏文章数量从多到少与“把书读薄”是一个道理

浙公网安备 33010602011771号