Threadlocal常见知识点以及面试题【超详细】

      ThreadLocal中用于保存线程的独有变量的数据结构是一个内部类:ThreadLocalMap,也是k-v结构

       key就是当前的ThreadLocal对象value就是我们想要保存的值,同时栈上的ThreadLocal也有一个引用指向ThreadLocal对象。

       Thread类对象中维护了ThreadLocalMap成员变量,而ThreadLocalMap维护了以ThreadLocal为key,需要存储的数据为value的Entry数组,这是他们三者之间的包含关系。

       ThreadLocal的作用其实很简单就是给每个线程在线程存储一个共享变量的副本,保证个线程对于共享变量的访问和修改互不影响。并且数据在线程内共享,线程外互斥。

常用场景: 

        用户身份信息存储:一般网页啥的不都是得登陆之后才能访问好多数据吗,这样我们可以登陆成功之后九八用户信息存储到ThreadLocal中,这样后续所有流程中,需要获取用户信息的,直接取ThreadLocal中获取就可以了。

        线程安全:可以用来定义一些需要并发安全处理的用户变量,就是为每个线程创建一个独立的变量副本。

        日志上下文存储:比如在Log4j等日志框架,经常用ThreadLocal来存储与当前线程相关的日志上下文。

        traceld存储:和存储上下文差不多,在分布式链路中,需要存储本次请求的traceld,通常也都是基于ThreadLocal存储的。

        数据库Session:好多框架比如mybatis,都是使用ThreadLocal来存储和管理数据库会话的,这样保证每个线程都有自己的会话实例,避免在多线程环境中出现的线程安全问题。

        PageHelper分页

其实主要就两功能:

1、解决并发问题

2、在线程中传递数据,线程执行过程中,ThreadLocal的数据一直都在,所以可以把前面的数据放在ThreadLocal中,然后再后面用的时候再取出来用,可以避免一直通过参数传递数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值