经过 ThreadLocal 能数据保存在一个线程中,并且不须要 lock 同步。理论上 ThreadLocal 可数组
以让一个变量在每一个线程都有一个副本。 ThreadLocal 经常使用来屏蔽线程的私有变量,例如“并this
发事务”或者其余的资源。并且,它还被用来维护每一个线程的计数器,统计,或者 ID 生成spa
器。线程
由ThreadLocal经常使用的get方法定义看:索引
public T get() {事务
Thread t = Thread.currentThread();资源
ThreadLocalMap map = getMap(t);get
if (map != null) {同步
ThreadLocalMap.Entry e = map.getEntry(this);it
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
能够知道,每一个Thread内部都有一个ThreadLocal.ThreadLocalMap threadLocals;这个map的维护是由ThreadLocal表现.并且它的初始化是lazily.
每一个ThreadLocal当前的nextHashCode的生成,以及它在ThreadLocalMap内部数组的索引的生成能够看源代码.