并发容器之 ThreadLocal 缓存

本文深入解析了ThreadLocal类,它是Java中用于创建线程局部变量的关键类。通过ThreadLocal,每个线程都能拥有自己的变量副本,避免了并发访问共享资源的问题。文章详细介绍了ThreadLocal的使用方法,包括创建、设置和获取线程局部变量的过程,并探讨了其工作原理。

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

ThreadLocal是什么

ThreadLocal是一个关于创建线程局部变量的类。是线程私有的。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。

虽然ThreadLocal并不在java.util.concurrent包中而在java.lang包中,但更倾向于把它当作是一种并发容器(虽然真正存放数据的是ThreadLoclMap)进行归类。从ThreadLocal这个类名可以顾名思义的进行理解,表示线程的“本地变量”,即每个线程都拥有该变量副本,达到人手一份的效果,各用各的这样就可以避免共享资源的竞争。

在实际项目中我们需要将一些信息放到单个线程里,比如,前端传过来的token等。

用法

(1)ThreadLocal是支持泛型的,首先创建存储的对象(若存储的是基本数据类型,则不需要创建)

public class BaseSignatureRequest {
    private String token;
    private String userId;

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }
}

 (2)创建ThreadLocal变量

public class ThreadLocalCache {
    public static ThreadLocal<BaseSignatureRequest>
            baseSignatureRequestThreadLocal = new ThreadLocal<>();
}

(3)设置值

//token放入threadLocal
                BaseSignatureRequest baseSignatureRequest = new BaseSignatureRequest();
                baseSignatureRequest.setToken(String.valueOf(result.getData()));
                baseSignatureRequest.setUserId(userId);
                ThreadLocalCache.baseSignatureRequestThreadLocal.set(baseSignatureRequest);

(4)获取值(用完后删除,防止内存溢出)

BaseSignatureRequest baseSignatureRequest = ThreadLocalCache.baseSignatureRequestThreadLocal.get();
 //使用后清理ThreadLocal
ThreadLocalCache.baseSignatureRequestThreadLocal.remove();

原理

参考:http://con.zhangjikai.com/ThreadLocal.html

https://juejin.im/post/5aeeb22e6fb9a07aa213404a

https://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值