线程面试——ThreadLocal原理以及用途

一 介绍

thread threadlocal threadlocalmap 之间的关系

一个thread里面包含一个threadlocalmap,threadlocalmap以entry[] key value的形式 ,key里面放threadlocal对象 ,value里面放值

二 两大使用场景

2.1 每个线程需要一个独立对象 ,比如工具类不安全

例子

1. 两个线程使用 时间格式转换工具类,new两个对象

2. 如果是1000个线程,使用线程池 并发会出现线程不安全

3.尝试把时间格式对象放入每个线程当中,这样保证了线程安全

2.2 每个线程都需要全局变量 比如用户信息

拦截器里面的用户信息, 每个服务都需要 传参不够利索 ,把用户信息放入一个线程中的threadlocalmap中 其它服务需要的话 直接获取就可以了。

三 内存泄漏的原因,如何避免?

threadlocalmap 里面 entry[] key是弱引用 value是强引用 GC会把弱引用给回收,导致value用不上也不释放内存,正常情况下 线程结束,都会回收,但是在线程池的线程一直在工作,如果key回收 value不回收 就会导致内存泄漏,如何避免呢 使用完threadlocal对象之后,应该删除,调用remove方法

set remove refash 方法有先判断key是否为空 为空会置value为空

四 好处

1.线程安全

2.保证线程安全,没有使用锁,提高效率

3.免去了传神的麻烦

4.每个线程保存信息 内存换效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值