ThreadLocal介绍与常见核心面试题

什么是ThreadLocal
全称thread local variable(线程局部变量)功⽤⾮常简单,使⽤场合主要解决多线程中数据因并发产⽣不⼀致问题。
ThreadLocal为每⼀个线程都提供了变量的副本,使得每个线程在某时间访问到的并不是同⼀个对象,这样就隔离了多个线程对数据的数据共享,这样的结果是耗费了内存,但⼤⼤减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。
总结起来就是:同个线程共享数据
注意:ThreadLocal不能使⽤原⼦类型,只能使⽤Object类型

核心应⽤场景
ThreadLocal ⽤作每个线程内需要独⽴保存信息,⽅便同个线程的其他⽅法获取该信息的场景。每个线程获取到的信息可能都是不⼀样的,前⾯执⾏的⽅法保存了信息后,后续⽅法可以通过ThreadLocal 直接获取到,避免了传参,类似于全局变量的概念,⽐如⽤户登录令牌解密后的信息传递(还有⽤户权限信息、从⽤户系统获取到的⽤户名、⽤户ID)

ThreadLocal常⻅核心⾯试题
面试题1
ThreadLocal和Synchronized的区别
(1)都是为了解决多线程中相同变量的访问冲突问题
(2)Synchronized是通过线程等待,牺牲时间来解决访问冲
(3)ThreadLocal是通过每个线程单独⼀份存储空间,牺牲空间来解决冲突
(4)对⽐Synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值

面试题二
为什么ThreadLocal的键是弱引⽤,如果是强引⽤有什么问题?
Java中除了基础的数据类型以外,其它的都为引⽤类型。
⽽Java根据其⽣命周期的⻓短将引⽤类型⼜分为强引⽤ 、 软引⽤ 、 弱引⽤ 、 虚引⽤。
正常情况下我们平时基本上我们只⽤到强引⽤类型,⽽其他的引⽤类型我们也就在⾯试中,或者平⽇阅读类库或其他框架源码的时候才能⻅到

1、强引⽤ new了⼀个对象就是强引⽤ Object obj = newObject();

2、软引⽤的⽣命周期⽐强引⽤短⼀些,通过SoftReference类实现,当内存空间⾜够,垃圾回收器就不会回收它; 当JVM认为内存空间不⾜时,就会去试图回收软引⽤指向的对象,也就是说在JVM抛出OutOfMemoryError之前,会去清理软引⽤对象主要⽤来描述⼀些【有⽤但并不是必需】的对象
**使⽤场景:**适合⽤来实现缓存,内存空间充⾜的时候将数据缓存在内存中,如果空间不⾜了就将其回收掉

3、弱引⽤是通过WeakReference类实现的,它的⽣命周期⽐软引⽤还要短,在GC的时候,不管内存空间⾜不⾜都会回收这个对象
使⽤场景:⼀个对象只是偶尔使⽤,希望在使⽤时能随时获取,但也不想影响对该对象的垃圾收集,则可以考虑使⽤弱引⽤来指向该对象。

ThreadLocal为什么是WeakReference呢?
如果是强引⽤,即使把ThreadLocal设置为null,但是ThreadLocalMap还持有ThreadLocal的强引⽤,如果没有⼿动删除,ThreadLocal不会被回收,导致Entry内存泄漏
如果是弱引⽤
引⽤ThreadLocal的对象被回收了,由于ThreadLocalMap持 有ThreadLocal的弱引⽤,即使没有⼿动删除,ThreadLocal也会被回收。value在下⼀次ThreadLocalMap调⽤set、get、remove的时候会被清除

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

工藤学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值