ThreadLocal源码分析

分析一波ThreadLocal


废话不多说,先上测试代码。如下:

public class ThreadLocalTest {

    public static void main(String[] args) {
        ThreadLocal<String> stringThreadLocal = new ThreadLocal<String>();
        stringThreadLocal.set("hello world");
        System.out.println(stringThreadLocal.get());
    }
}

接下来让我们进入set方法看看做了什么

 public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

分析下上述代码

1.Thread t = Thread.currentThread(); 获取当前线程对象

2.ThreadLocalMap map = getMap(t);根据当前的线程对象获取对应的ThreadLocalMap

3.判断map是否为空。不为空则以ThreadLocal为key,"hello world"为值设置到map中。

4.map为空,创建ThreadLocalMap 并且设置key和value。


大家会问set方法中getMap方法做了啥?createMap方法做了啥?

接下来分析getMap和createMap这两个方法


getMap源码如下:

 ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }

1.方法直接返回线程对象中的threadLocals成员变量。

2.转到Thread类中查看下threadLocals这个成员变量 ThreadLocal.ThreadLocalMap threadLocals = null; 此 threadLocals的类型即是ThreadLocalMap 。


在看createMap这个方法做了什么

 void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }
1.以当前ThreadLocal为key,“hello word”为值创建了ThreadLocalMap 对象。

2.将创建的ThreadLocalMap 赋值给线程的threadLocals成员变量


ThreadLocal set方法的源码已经全部分析完。

接下来分析get方法源码。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值