ThreadLocal讲解

ThreadLocal讲解

引言

ThreadLocal是和线程息息相关的一个类,从字面意思来看,就是线程+本地,那么其到底是什么,又该怎么使用。接下来我们就来讲解一下。

示例

下面这个小程序中,定义了两个变量tl和str,新起一个线程对其设置值,睡眠3秒后打印这两个值。主线程会修改这两个值的属性。从输出结果可以看到ThreadLocal变量可以起到线程隔离的作用。

public class ThreadLocalTest {
    static ThreadLocal<String> tl = new ThreadLocal<>();
    static String str = "";
    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                tl.set("thread1");
                try {
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("tl: " + tl.get());
                System.out.println("str: " + str);

            }
        }).start();
        str = "main";
        tl.set("main");
    }
}

输出结果

tl: thread1
str: main

源码分析

从源码可以看到,set值时会获得当前线程中的threadLocals,其实际是一个map,然后把值set进去。所以值是存在每个线程独有的threadLocals中的,做到了线程隔离。

// ThraedLocal源码
public class ThreadLocal<T> {
    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
}

ThreadLocalMap getMap(Thread t){
        return t.threadLocals;
    }

// Thread 源码
public class Thread implements Runnable{
	ThreadLocal.ThreadLocalMap threadLocals = null;
}

应用场景

spring结合mybatis时,声明式事务中的数据库连接connection就是放在threadLocals中的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

平平安安年年

一起学习,一起成长

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

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

打赏作者

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

抵扣说明:

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

余额充值