ThreadLocal就是用于存储当前运行线程独享的变量值,不会与其他线程共享。
1. Thread类中的threadLocals属性值
/* ThreadLocal values pertaining to this thread. This map is maintained
* by the ThreadLocal class. */
public class Thread implements Runnable {
....
ThreadLocal.ThreadLocalMap threadLocals = null;
...
}
复制代码
2. ThreaLocal与ThreadLocalMap的关系类图
3. 理解点:
ThreadLocal
是对ThreadLocalMap
操作的封装,通过set
方法和get
方法来设置ThreadLocalMap
对象的key、value值。- key值是ThreaLocal对象,而value是传进去的任意值。而一个Thread对象都有一个
ThreadLocal.ThreadLocalMap
类型的threadLocals
属性,是一个map,也就是表示一个Thread线程对象的threadLocals可以设置多个ThreadLocal对象作为key。 - 在线程通过ThreadLocal对象去调用set方法时,若threadLocals属性为null,才会初始化threadLocals属性值。
public class ThreadLocal<T> {
/**
* set方法 当前线程关联的threadLocals设置ThreadLocal为key的值。
*/
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
/**
*get方法,通过当前线程属性threadLocals获取ThreadLocal为key所对应的值。
*/
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
}
复制代码