ThreadLocal和InheritableThreadLocal的使用

本文介绍了InheritableThreadLocal类及其与ThreadLocal的区别。InheritableThreadLocal允许子线程继承父线程的变量值,适用于需要在线程间传递状态的应用场景。文章还提供了示例代码,并对比了几种多线程共享数据的方法。

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

今天在看一个开源项目的时候注意到InheritableThreadLocal类,之前接触的一般都是ThreadLocal类。ThreadLocal这个类大家都比较熟悉。

一句话解释就是这个ThreadLocal存放的是各线程独立的“对象数据”,各线程互不干扰,也不能共享访问,避免并发问题。而InheritableThreadLocal要解决的是要在所有线程中全局共享同一个对象, 所以在当前线程上创建一个新的线程实例Thread时,会把这些线程变量从当前线程传递给新的线程实例(把父线程的数据传递给新线程)。(此时线程变量不再线程安全,需要考虑线程安全问题) ,之前面试的时候问道多线程之间怎样共享数据,方式其实有很多,比如:

1、共享存储系统保存对象(redis缓存、文件形式等)

2、创建共享对象通过值传递给新的线程

3、静态变量的形式

4、多线程共用 Runnable对象

现在看来是用InheritableThreadLocal也是不错的一种方式。

ThreadLocal和InheritableThreadLocal的区别就是:

InheritableThreadLocal可以获取父级线程的内容,而ThreadLocal不能。

使用方式及源码参考:

public class ThreadLocalContext extends InheritableThreadLocal<RequestContext> {

    private static final RequestIDGenerator requestIdGenerator = RequestIDGenerator.getInstance();
    private static final ThreadLocalContext instance = new ThreadLocalContext();

    @Override
    protected RequestContext initialValue() {
        return new RequestContext(requestIdGenerator.nextId());
    }

    public static HttpServletRequest getServletRequest() {
        return instance.get().getOriginRequest();
    }

    public static RequestContext getRequestContext() {
        return instance.get();
    }

    public static void clear() {
        instance.remove();
    }
}

下面是几篇ThreadLocal和InheritableThreadLocal深入介绍的文章,这里就不再深入了。

Java 多线程:InheritableThreadLocal 实现原理

java concurrency in practice读书笔记---ThreadLocal原理

 

转载于:https://my.oschina.net/u/915967/blog/1605866

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值