一、Thread
public class Thread(){
//省略部分
//属于这个线程的ThreadLocals,这个map由ThreadLocal类维护
ThreadLocal.ThreadLocalMap threadLocals = null;
//省略部分
}
二、ThreadLocal
public class ThreadLocal(){
//省略部分
//set操作
public void set(T value) {
//当前调用set方法的线程
Thread t = Thread.currentThread();
//获取当前调用线程的ThreadLocalMap
ThreadLocalMap map = getMap(t);
if (map != null)
//this 为静态的一个自定义的ThreadLocal对象的引用,map存在则set
map.set(this, value);
else
//map 不存在则新建
createMap(t, value);
}
// new 一个ThreadLocalMap
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
// get操作
public T get() {
//当前调用get方法的线程
Thread t = Thread.currentThread();
//获取当前线程的ThreadLocalMap
ThreadLocalMap map = getMap(t);
if (map != null) {
//this 为静态的一个自定义的ThreadLocal对象的引用
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
//省略部分
}
三、小结
-
每个线程对象都有一个自己的ThreadLocalMap类对象,由ThreadLocal对象维护,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。
-
将一个共用的ThreadLocal静态实例(通常在需要的方法中自定义)作为key,将不同值对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象
四、使用场景
- session问题配合Filter一起使用
- 多数据源配置,通过配置当前线程的datasoure信息