threadlocal是一个线程安全的容器类,在每个线程里都有一张map表,用来存储数据,达到线程安全的效果。
set方法
public void set(T value) {
获取当前线程
Thread t = Thread.currentThread();
获取当前线程中的map
ThreadLocalMap map = getMap(t);
if (map != null) {
存储对象,key是threadlocal本身,value是对象
map.set(this, value);
} else {
初始化map,并存储value
createMap(t, value);
}
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
初始化桶数组,容量为16
table = new Entry[INITIAL_CAPACITY];
计算firstvalue在桶中的位置
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
设置扩容阈值
setThreshold(INITIAL_CAPACITY);
}
get方法
public T get() {
获取当前线程
Thread t = Thread.currentThread();
获取当前线程的map
ThreadLocalMap map = getMap(t);
if (map != null) {
以当前threadlocal为key,查询map中对应的value
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
private T setInitialValue() {
初始值为null
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
map.set(this, value);
} else {
createMap(t, value);
}
if (this instanceof TerminatingThreadLocal) {
TerminatingThreadLocal.register((TerminatingThreadLocal<?>) this);
}
return value;
}