ThreadLocal相当于一个容器,用于存放每个线程的局部变量。ThreadLocal实例通常来说都是private static类型的。ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。
一般情况下,通过ThreadLocal.set()到线程中的对象是该线程自己使用的对象,其他线程是访问不到的,各个线程中访问的是不同的对象。如果ThreadLocal.set()对象的set(Object o)时,该方法则通过Thread.currentThread()获取当前线程,将变量存入线程中的ThreadLocalMap类的对象内,Map中元素的键为当前的ThreadLocal对象,而值对应线程的变量副本。
public T get() {
//每个Thread对象内都保存一个ThreadLocalMap对象
Thread t = Thread.currentThread();
//map中元素的键为共用的ThreadLocal对象,而值为对应线程的变量副本。
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();
}
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}