ThreadLocal的作用和原理

ThreadLocal提供线程本地存储,用于在线程生命周期内共享对象,避免并发问题。它通过在Thread内部的ThreadLocalMap存储数据,实现线程私有变量。在方法调用间传递参数,如slfj的MDC、多数据源场景。当线程结束,ThreadLocalMap及其存储的对象将被回收。使用时注意适时调用remove()清理资源。
摘要由CSDN通过智能技术生成

ThreadLocal可以称为线程本地变量或线程本地存储,跟方法内作用域的变量一样,都是本线程私有的。可以用来在一个线程调用多个方法的过程中、用来传递参数,省去通过方法入参传递的麻烦。slfj的MDC,多数据源,以及弱引用WeakReference等等场景中都可以看到ThreadLocal的应用。

线程本地存储:在线程生命周期内作为上下文存储共享对象

这里的上下文指的是线程存活期间内,调用多个方法,各个方法之间共享的“上下文空间”。

我们知道,每个线程对应着它的线程栈,线程栈由栈帧组成,用这套数据结构来跟踪线程的方法调用。
每个栈帧里边存放着一个方法内的局部变量,进入一个方法则压入一个栈帧,从一个方法返回则弹出一个栈帧。
考虑一个问题:如果想在一个thread生命周期内,在多个栈帧或者说多个方法之间共享对象呢?
用局部变量显然不行,其作用域只在方法里或者栈帧内,每个栈帧维护自己的局部变量表,另一个栈帧不认识。thread里边弄个静态变量当然可以,但是这是类级别的、就对别的thread实例可见,要考虑并发问题了。
想来想去,在Thread类的内部的成员变量中搞个Map来存放这些值是个不错的主意:作用域是每个thread实例,酷我音乐能够被线程生命周期内各个方法调用所共享。我想这就是ThradLocalMap和ThreadLocal的由来。

ThreadLocal的使用方法

先看例子程序:

使用ThreadLocal在线程的多个方法调用之间共享参数

public class WorkerThread implements Runnable{
    public static ThreadLocal<Map> paramA = new ThreadLocal<>();
    private CountDownLatch latch;
    
    public WorkerThread(CountDownLatch latch) {
        this.latch = latch;
    }
    
    @Override
    public void run() {
        ThreadLocalTest tlt = new ThreadLocalTest();
        tlt.initParamA();
        tlt.useParamA();
        latch.countDown();
    }

}

public class ThreadLocalTest {
    private static Logger logger = L
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pxr007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值