【面试高频 time: 2022-10-14】ThreadLocal常问面试题收集
ThreadLocal和Synchronized的区别
-
都是为了解决多线程中相同变量的访问冲突问题 Synchronized是通过线程等待,牺牲时间来解决访问冲突 ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决问题 对比ThreadLocal和Synchronized具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值
为什么ThreadLocal的键是弱引用,如果是强引用会有什么问题?
-
Java中除了基础的数据类型以外,其它的都为引⽤类型。 ⽽Java根据其⽣命周期的⻓短将引⽤类型⼜分为强引⽤ 、 软 引⽤ 、 弱引⽤ 、 虚引⽤ 正常情况下我们平时基本上我们只⽤到强引⽤类型,⽽其他的引 ⽤类型我们也就在⾯试中,或者平⽇阅读类库或其他框架源码的 时候才能⻅到 1、强引⽤ new了⼀个对象就是强引⽤ Object obj = new Object(); 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的时候会被清除。
