为了使httpsession在整个项目都可以获取到,比如直接在service层或者dao层调用,不用从controllar传过那么麻烦,这时候可以用ThreadLocal来管理httpsession
简单理解下ThreadLocal
每个线程Thread有一个属性
ThreadLocal.ThreadLocalMap threadLocals = null
它是一个map用来存放多个threadlocal
当前线程第一次有threadlocal调用set方法时会创建一个ThreadLocalMap,值写进去,然后和当前线程绑定
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
之后的threadlocal的set和get方法都先获取当前线程,通过线程拿到ThreadLocalMap,然后通过当前的threadlocal(key)拿到对应的value或者修改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();
}
public void set(T value) {