ThreadLocal源码分析:(二)get()方法

本文详细分析了ThreadLocal的get方法,解释了如何从当前线程的ThreadLocalMap中获取值,涉及getEntry、getEntryAfterMiss和expungeStaleEntry等方法。在get过程中,如果发现key为null的条目,会调用expungeStaleEntry进行清理,以协助垃圾回收。此外,get方法也可能触发ThreadLocalMap中废弃条目的清理。
摘要由CSDN通过智能技术生成

在ThreadLocal的get(),set()的时候都会清除线程ThreadLocalMap里所有key为null的value。
而ThreadLocal的remove()方法会先将Entry中对key的弱引用断开,设置为null,然后再清除对应的key为null的value。
本文分析get方法

ThreadLocal类的get方法

public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);     // 获取线程t中的ThreadLocalMap
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);    // 获取entry,见代码1
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();   // 没有找到对应的值,调用setInitialValue方法并返回初始值,见代码4
}

关键逻辑就是去当前线程的ThreadLocalMap中获取对应此ThreadLocal对象的entry,如果获取到了就返回entry的value。否则返回调用setInitial

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值