彻底理解ThreadLocal原理

本文探讨了Java中的ThreadLocal类,通过分析set方法源码,揭示了ThreadLocal如何为每个线程创建独立的存储空间,确保变量在线程内的可见性。在set过程中,ThreadLocal首先获取当前线程,接着创建ThreadLocalMap,并将ThreadLocal对象作为键存储在Thread的threadLocals属性中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近准备找暑期实习,在看Java并发编程的艺术这本书,前面关于JMM的部分还是挺难的,看到第四章,终于进入了并发专题。突然出现了ThreadLocal这个类,一回忆,之前还用过这个类,使用ThreadLocal保存的值,只有在当前线程才可见。

下面介绍一下其实现原理:

首先进入ThreadLocal类,观察其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);
    }

首先获取到当前线程t,然后调用了getMap(t),得到一个ThreadLocalMap对象
于是继续追踪getMap()方法

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

getMap方法返回了t线程的threadLocals属性
进入Thread类

    ThreadLocal.ThreadLocalMap threadLocals = null;

threadLocals默认为null,所以set方法会调用createMap方法

    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

    ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
        table = new Entry[INITIAL_CAPACITY];
        int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
        table[i] = new Entry(firstKey, firstValue);
        size = 1;
        setThreshold(INITIAL_CAPACITY);
    }

可以发现在createMap方法中,创建了一个ThreadLocalMap对象,其中key为当前ThreadLocal对象,而这个ThreadLocalMap对象为当前Thread的属性

结论

至此,我们发现每个线程都有一个ThreadLocalMap属性,当前线程创建了ThreadLocal对象后,调用其set方法,会将其作为键存入ThreadLocalMap中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值