ThreadLocal 浅析

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();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值