ThreadLocal使用场景及用法
ThreadLocal常用在框架中,如Struts中存储请求对象(包括请求参数、上下文环境变量), 项目中存储登录的用户信息, 在一个请求的过程中设置ThreadLocal值后,执行到其他方法时, 都可以获取设置的值
class AccountContext {
private static final ThreadLocal<Account> account = new ThreadLocal<Account>();
public static final Account getCurrentAccount() {
return account.get();
}
public static final void setCurrentAccount(Account account) {
account.set(account);
}
public static final void removeCurrentAccount() {
account.remove();
}
}
ThreadLocal、ThreadLocal.ThreadLocalMap、Thread类的关系及存取过程
1、ThreadLocalMap是ThreadLocal类的内部类,ThreadLocalMap数据结构,类似于HashMap,存储key/value,key:ThreadLocal对象, value:ThreadLocal对象存储的目标值(即上术例子中的Account对象)
2、Thread类有一成员变量,ThreadLocal.ThreadLocalMap threadLocals = null
3、threadLocal对象在执行set、get方法时,
a、获取当前线程,即:Thread.currentThread()
b、获取ThreadLocalMap, 即:上一步的currentThread.threadLocals
4、set方法
如果获取的ThreadLocalMap为空, 则创建ThreadLocalMap, 将创建的threadLocalMap赋值给当前线程的threadLocals,threadLocals中存储key:threadLocal对象, value:目标对象
5、get方法
从当前线程的threadLocalMap中获取key=threadLocal 对应的数据
ThreadLocal类的常用方法分析
1、set方法
public void set(T value) {
Thread t = Thread.currentThread();//获取当前的线程
ThreadLocalMap map = getMap(t);
if (map != null) //判断ThreadLocalMap中是否有值,如果没有,则创建ThreadLocalMap
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals; //threadLocals是Thread类的属性
}
public class Thread implements Runnable {
........
ThreadLocal.ThreadLocalMap threadLocals = null;//threadLocals类型是:ThreadLocal.ThreadLocalMap类型变量,存储类似key,value的形式数据,key:threadLocal对象,value:真正要在threadLocal中存储的数据(即目标数据)
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);//创建ThreadLocalMap对象,并将要存储的值,存储放到ThreadLocalMap中, key为ThreadLocal对象, value为thredLocal.set()方法的参数值
}
2、get方法
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}