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
    评论
回答: ThreadLocal面试主要考察对ThreadLocal的理解和使用。ThreadLocal是一种用于解决多线程并发问的思路,它为每个线程提供了一个独立的变量副本,以避免线程之间的数据共享和竞争问。在多线程环境下,每个线程通过ThreadLocal来访问自己的变量副本,从而保证了线程之间的数据隔离。 在面试中,可能会考到ThreadLocal的使用场景、使用方法以及其局限性。ThreadLocal的使用场景包括但不限于线程池、web应用中的用户信息存储、数据库连接管理等需要保证线程安全的情况。ThreadLocal的使用方法是通过set方法设置线程的变量副本,通过get方法获取线程的变量副本。需要注意的是,每个线程对应一个ThreadLocal实例,且每个ThreadLocal实例都会创建一个ThreadLocalMap用于存放线程的变量副本。 然而,ThreadLocal也有一些局限性。例如,ThreadLocal只能在当前线程内部共享数据,无法在线程之间共享。另外,由于ThreadLocal的使用需要创建副本,当线程数量很大时,可能会导致内存占用过大。此外,使用ThreadLocal时需要注意内存泄漏的问,即使用完ThreadLocal后需要及时清理,否则可能会导致内存泄漏。 综上所述,ThreadLocal是一种用于解决多线程并发问的思路,通过为每个线程提供独立的变量副本来实现线程间的数据隔离。在面试中,可能会问到ThreadLocal的使用场景、使用方法以及其局限性。需要注意的是,ThreadLocal的使用要避免内存泄漏问,并且在多线程环境下合理使用,以确保线程安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [面试 - ThreadLocal详解](https://blog.csdn.net/wangnanwlw/article/details/108866086)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [ThreadLocal高频面试](https://blog.csdn.net/qq_43255017/article/details/126296062)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

工藤学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值