面试~ThreadLocal

简介: 面试~ThreadLocal

四种常见的引用

强引用---不可回收

软引用---内存不足即回收

弱引用---发现即回收

虚引用---形同虚设,目的是用于对象回收跟踪



ThreadLocal

1、ThreadLoca 是什么

ThreadLocal并不是一个Thread,而是Thread的局部变量

在jdk解决并发问题上,threadLocal是一种使用空间换时间的思路,ThreadLocal为每个线程提供一个独立的变量副本 解决了变量并发访问的冲突问题。

我的项目中,运用了threadLocal保存用户信息,实现客户端请求会话的隔离,保证了多用户的多会话请求的线程安全。

同时,使用完threadLocal后,删除value,防止了threadLocal引起的内存泄漏


★ threadLocal 为什么会导致内存泄漏----强引用、弱引用

----(这面试说强引用。弱引用。不是明摆着让面试官间JVM嘛)

主要是涉及到对象的强应用、弱引用问题

  • 强引用---不可回收
  • 弱引用---发现即回收

查看源码发现,每个线程都有一个自己的ThreadLocalMap对象,ThreadLocalMap的 key 是存储threadLocal的引用,vaule存储变量的副本


2、ThreadLocal的原理

1.ThreadLocal是Java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据

2.ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象(注意不是ThreadLocal对象)中都存在一个ThreadLocalMap,Map的key为 ThreadLocal对象,Map的value为需要缓存的值

其中,threadLocal对象是弱引用,在GC的时候,会被自动回收。而value就是ThreadLocal类 set设置的数据。value是强引用,不会被GC。


3、为什么用ThreadLocal做key?

不知道你有没有思考过这样一个问题:ThreadLocalMap为什么要用ThreadLocal做key,而不是用Thread做key?


确实,jdk早期的设计,是 threadLocal 维护 threadLocalMap,而线程作为key,

但是这种设计在 jdk8 之后,就被取代了,变成 thread 维护 threadLocalMap,而 threadLocal 作为 key

是因为我们知道线程的数量往往比threadLocal 多,jdk8的设计就可以使得 threadLocalMap 存储的 entry 数量变少。

也更加的节省了内存,当 thread 销毁了, 对应 threadLocalMap 也会被销毁


4、为什么把ThreadLocal设计成弱引用?

是最大程度的解决内存泄露问题,因为threadLocal 设计成弱引用,GC 的时候,发现它即可回收。

  • 使用get、set或remove方法清理key为null的value值


5、为什么内存泄露

  • 涉及到强引用和弱引用。因为我的项目为了查看文章详情同时更新阅读浏览数,引入了线程池。
  • 线程池中使用ThreadLocal会造成内存泄漏,因为当ThreadLocal对象使用完之后,应该要把设置的key,value,也就是Entry对象进行回收,
    但线程池中的线程不会回收,而线程对象是通过强引用指向ThreadLocalMapThreadLocalMap也是通过强引用指向Entry对象,线程不被回收,Entry对象也就不会被回收,从而出现内存泄漏
  • 解决办法是,在使用了ThreadLocal对象之后,手动调用ThreadLocal的remove方法,手动清除Entry对象


★ 项目细节:

使用一个拦截器拦截请求,从cookie中获取token字符串与redis中的token进行匹配,获取用户信息,将用户信息存储到ThreadLocal中,在本次请求中持有用户信息,即可在后续操作中使用到用户信息。

★ 项目细节:在登录拦截器中prehandle方法中:验证token成功后,将用户信息存储到threadLocal;在afterCompletion方法中:对threadLocal做了value的删除,防止内存泄漏。

目录
相关文章
|
19天前
|
存储 安全 Java
面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
字节面试题:用过ThreadLocal吗?ThreadLocal是在哪个包下的?看过ThreadLocal源码吗?讲一下ThreadLocal的get和put是怎么实现的?
32 0
|
9月前
|
存储 机器学习/深度学习 算法
【Java面试】谈一谈你对ThreadLocal的理解
【Java面试】谈一谈你对ThreadLocal的理解
39 0
|
9月前
|
Java
【Java面试】说说你对ThreadLocal内存泄漏问题的理解
【Java面试】说说你对ThreadLocal内存泄漏问题的理解
87 0
|
9月前
|
缓存 监控 Java
【Java面试】Java中都有那些引用类型?(关于弱引用是如何解决ThreadLocal内存泄漏问题)
【Java面试】Java中都有那些引用类型?(关于弱引用是如何解决ThreadLocal内存泄漏问题)
66 0
|
存储 Java Spring
面试官:ThreadLocal 为什么会内存泄漏吗?是怎么产生的?面试必问!
面试官:ThreadLocal 为什么会内存泄漏吗?是怎么产生的?面试必问!
115 0
面试又被问懵了吗?不如把ThreadLocal拆开了揉碎看看
1.为什么用 ThreadLocal? 所谓并发,就是有限资源需要应对远超资源的访问。解决问题的方法,要么增加资源应对访问;要么增加资源的利用率。 所以,相信这年头做开发的多多少少,都会那么几个“线程二三招”、“用锁五六式”。 那所带来的就是多线程访问下的并发安全问题。 共享变量的访问域跨越了原始的单线程,进入了千家万户的线程眼里。谁都可以用,谁都可以改,那不就打起来了吗? 因此,防止并发问题的最好办法,就是不要多线程访问(这科技水平倒退二十年~)。ThreadLocal 顾名思义,将一个变量限制为“线程封闭”:对象只被一个线程持有、访问、修改。
|
SQL 负载均衡 网络协议
收集牛客网腾讯面试查漏补缺【threadlocal、explain、引用】
收集牛客网腾讯面试查漏补缺【threadlocal、explain、引用】
109 0
收集牛客网腾讯面试查漏补缺【threadlocal、explain、引用】
|
安全 Java 数据库连接
常见面试题梳理:源码角度彻底揭秘ThreadLocal
ThreadLocal在日常开发中还是比较常见的,本文将从源码的角度彻底揭秘ThreadLocal,并会分享一些较为常见的面试题,let's go。 ThreadLocal是什么? ThreadLocal隶属于lang包,它的主要功能是为每个线程提供一个私有的局部变量,这个变量在线程间相互隔离,互不影响。 主要解决的就是单例情况下全局变量的线程安全问题
|
存储 Java 数据库连接
面试官:知道ThreadLocal嘛?谈谈你对它的理解?(基于jdk1.8)
在java的多线程模块中,ThreadLocal是经常被提问到的一个知识点,提问的方式有很多种,可能是循序渐进也可能是就像我的题目那样,因此只有理解透彻了,不管怎么问,都能游刃有余。 这篇文章主要从以下几个角度来分析理解 1、ThreadLocal是什么 2、ThreadLocal怎么用 3、ThreadLocal源码分析 4、ThreadLocal内存泄漏问题 下面我们带着这些问题,一点一点揭开ThreadLocal的面纱。若有不正之处请多多谅解,并欢迎批评指正。
285 0
面试官:知道ThreadLocal嘛?谈谈你对它的理解?(基于jdk1.8)
|
存储 算法 安全
面试官:说说你对ThreadLocal的了解
面试官:说说你对ThreadLocal的了解
面试官:说说你对ThreadLocal的了解