ThreadLocal子线程共享

简介: ThreadLocal子线程共享

世人缺乏的是毅力,而非气力。——雨果

昨天聊了ThreadLocal可以用作单个线程中变量共享

其底层实现其实就是个Map,用线程作为key,不信可以看这部分源码:

/**
 * Returns the value in the current thread's copy of this
 * thread-local variable.  If the variable has no value for the
 * current thread, it is first initialized to the value returned
 * by an invocation of the {@link #initialValue} method.
 *
 * @return the current thread's value of this thread-local
 */
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();
}


但是这里有个问题,如果是子线程,就访问不到了

我们深入源码看到这里有这么一个函数

/**
 * Method childValue is visibly defined in subclass
 * InheritableThreadLocal, but is internally defined here for the
 * sake of providing createInheritedMap factory method without
 * needing to subclass the map class in InheritableThreadLocal.
 * This technique is preferable to the alternative of embedding
 * instanceof tests in methods.
 */
T childValue(T parentValue) {
    throw new UnsupportedOperationException();
}

该方法在ThreadLocalMap的构造函数被调用,上面的注释说,该方法明显是在子类InheritableThreadLocal中定义的,这里提供这个方法,主要是能让Thread在构造函数中能调用上面说到的InheritableThreadLocalchildValue

可以看到Thread的构造函数中:

简单来说,如果是inheritableThreadLocal,就执行该方法。我们接着往里看ThreadLocalMap的构造方法

这里把ThreadLocalMap中所有的元素遍历出来,拿到key然后执行了childValue方法

这里key其实就是我们的子线程

我们再看InheritableThreadLocalchildValue的实现

他直接把传入的值return了出去(绕来绕去的,这里主要是考虑到如果还有别的行为,方便继承后可以拓展)

然后再将子线程作为的key和父value组成一个新的Entry元素,把它放到map里去

因此它可以在子线程中共享变量,因为它默认的实现就是子线程的key但是存的父值

写个demo测一下:

package com.ruben.study;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/**
 * ThreadLocal例子
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/23 16:43
 */
public class ThreadLocalDemo {
    private static final ThreadLocal<Long> MY_LONG_THREAD = new ThreadLocal<>();
    private static final ThreadLocal<Long> MY_LONG_INHERITABLE_THREAD = new InheritableThreadLocal<>();
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MY_LONG_THREAD.set(0L);
        MY_LONG_INHERITABLE_THREAD.set(1L);
        // 单线程共享变量
        CompletableFuture.runAsync(() -> {
            // 子线程尝试访问ThreadLocal中的值
            System.out.println(MY_LONG_THREAD.get());
            System.out.println(MY_LONG_INHERITABLE_THREAD.get());
        }).get();
        MY_LONG_THREAD.remove();
        MY_LONG_INHERITABLE_THREAD.remove();
    }
}

可以看到同样的代码,上面的ThreadLocal在子线程中获取不到,而它的实现InheritableThreadLocal就可以

相关文章
|
机器学习/深度学习 人工智能 运维
10 分钟搞懂 LLMOps
10 分钟搞懂 LLMOps
2722 0
|
JSON Java API
玩转Spring Boot之RestTemplate的使用
在java代码里想要进行restful web client服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。Spring Boot提供了一种简单便捷的内置模板类来进行操作,这就是RestTemplate。
6231 0
|
8月前
|
CDN
阿里云CDN怎么收费?看这一篇就够了,CDN不同计费模式收费价格全解析
阿里云CDN收费包含基础费用与增值费用。基础费用提供三种计费模式:按流量、带宽峰值及月结95带宽峰值计费,默认按流量计费,价格因地域和用量阶梯而异。增值费用涵盖静态HTTPS、QUIC请求、WAF防护及实时日志等服务,按需使用并单独计费。此外,可通过购买资源包预付费降低整体成本。更多详情参见阿里云官方文档。
2096 8
|
存储 缓存 安全
阿里云服务器内存型r7、r8a、r8y、r8i实例区别及选择参考
随着阿里云2024年金秋云创季的开始,目前在阿里云的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y和内存型r8i这几个实例规格,相比于活动内的经济型e和通用算力型u1等实例规格来说,这些实例规格等性能更强,虽然这几个实例规格的云服务器通常处理器与内存的配比为都是1:8,但是他们在处理器、存储、网络、安全等方面等性能并不是一样的,所以他们的适用场景也有着不同。本文为大家介绍内存型r7、r8a、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
机器学习/深度学习 自然语言处理 索引
Moirai:Salesforce的时间序列预测基础模型
过去几个月,时间序列基础模型发展迅速,包括TimeGPT、Lag-Llama、Google的TimesFM、Amazon的Chronos和Salesforce的Moirai。本文聚焦于Moirai,这是一个用于时间序列预测的通用模型,尤其强调零样本推理能力。Moirai处理各种数据频率、适应未知协变量并生成概率预测。文章介绍了Moirai的三个关键特性:多尺寸补丁投影层、任意变量注意力和混合分布。此外,还对比了Moirai与Chronos和TimeGPT,发现Moirai在性能上未超越Chronos,后者在数据效率上更优,但不支持多变量预测。
764 2
|
Java
Mac 设置 JAVA_HOME
Mac 设置 JAVA_HOME
622 0
|
安全 网络安全 数据安全/隐私保护
邮箱IMAP服务怎么开启?步骤及方法
开启邮箱IMAP服务,实现多设备邮件同步:登录邮箱,进入设置,找到IMAP设置,开启服务并保存。配置邮件客户端,输入邮箱地址、IMAP服务器地址(如imap.yourmailserver.com)、端口993、安全连接SSL/TLS。完成配置后,即可跨设备同步收取邮件。
|
SQL 监控 Java
mybatis拦截器实现
mybatis拦截器实现
170 0
|
负载均衡 Java Nacos
Spring cloud Alibaba Nacos And OpenFeign
Spring cloud Alibaba Nacos And OpenFeign
786 0

热门文章

最新文章