ThreadLocal
ThreadLocal是一个数据结构,有点像HashMap,可以保存"key : value"键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰。
ThreadLocal<String> local = new ThreadLocal();
local.set("hzk");
String value = local.get();
在线程1中初始化了一个ThreadLocal对象local,并通过set方法,保存了一个值hzk,同时在线程1中通过local.get()可以拿到之前设置的值,但是如果在线程2中,拿到的将是一个null。
ThreadLocal保证了各个线程的数据互不干扰。
ThreadLocal的实现
ThreadLocal如何保证了各个线程的数据互不干扰呢?
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
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();
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
如上,分析ThreadLocal的get()与set()方法,可以发现,每个线程中都有一个ThreadLocalMap数据结构,当执行set方法时,其值是保存在当前线程的threadLocals变量中,当执行set方法中,是从当前线程threadLocals变量获取。
所以在线程1中set的值,对线程2来说是看不到的,而且在线程2中重新set的话,也不会影响到线程1中的值,保证了线程之间不会相互干扰。