前言
ThreadLcoal提供了一种实现去让线程创建内部变量,而与其他线程隔离开来,这也是保证线程安全的方法之一。
想要实现这种功能,我们很自然会想到让ThreadLocal去维护一个HashMap,其中key是Thread对象,value是变量值。
但是ThreadLocal并没有这样做,而是每个线程维护一个ThreadLcoalMap,key是ThreadLocal对象,value是变量值。这样做的好处又是什么呢?
源码分析
set(T value)
public void set(T value) {
//先获取当前线程
Thread t = Thread.currentThread();
//获取线程内部维护的一个哈希表
ThreadLocal.ThreadLocalMap map = getMap(t);
if (map != null)
//如果存在,赋值
map.set(this, value);
else
//不存在,先创建再赋值
createMap(t, value);
}
get()
public T get() {
//获取当前线程
Thread t = Thread.currentThread();
//获取线程内部维护的一个哈希表
ThreadLocal.ThreadLocalMap map = getMap(t);
if (map != null) {
//从哈希表获取当前线程的内部变量,这里的this是ThreadLocal对象
ThreadLocal.ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
//设置初始化值,默认为null,可以重写setInitialValue()方法
return setInitialValue();
}