ThreadLocal的原理

ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

Thread-1中只有一个ThreadLocal.ThreadLocalMap(图中列就是一个ThreadLocal.ThreadLocalMap),而ThreadLocal设置值进去ThreadLocal.ThreadLocalMap是以它本身为key,所以一个ThreadLocal变量,对一个线程只能存储一个对象

 Thread-1Thread-2
ThreadLocal-1<ThreadLocal-1,value><ThreadLocal-1,value>
ThreadLocal-2<ThreadLocal-2,value><ThreadLocal-2,value>

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

以上是ThreadLocal的set方法。

1、首先获取当前的线程Thread对象t,通过getMap(t),拿到当前线程的ThreadLocalMap对象,该对象存储在当前线程对象的threadLocals属性。

2、如果当前线程已有对应的ThreadLocalMap 就,将当前的ThreadLocal对象作为key,设置的value做为value设置到ThreadLocalMap中。

3、如果当前线程没有ThreadLocalMap对象则,创建一个ThreadLocalMap对象,以当前ThreadLocal对象为key,设置的value做为value设置到ThreadLocalMap中.并将

这个ThreadLocalMap赋值给当前Thread对象的threadLocals属性。

ThreadLocal变量获取存储对象的步骤:

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

1、首先获取当前的线程Thread对象t,通过getMap(t),拿到当前线程的ThreadLocalMap对象,该对象存储在当前线程对象的threadLocals属性

2、以当前的ThreadLocal对象为key,获取ThreadLocalMap中的Entry对象,获取entry对象的 value属性,并返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值