ThreadLocal面试题 ThreadLocal 1、定义 首先我们得从Thread类讲起,在Thread类中有维护两个ThreadLocal.ThreadLocalMap对象(初始为null,只有在调用ThreadLocal类的set或get时才创建它们):threadLocals和inheritableThreadLocals。也就是说每个Thread对象都有两个ThreadLocalMap
public class ThreadLocalTest { private static ThreadLocal<Integer> num = new ThreadLocal<Integer>() { // 重写这个方法,可以修改“线程变量”的初始值,默认是null @Override protected Integer initialValue() { return 0; } }; public static void main(String[] args) { // 创建一号线程 new Thread(...
在本次案例中,我们是通过ThreadLocal.remove()方法,来解决内存泄漏问题。 但是其实解决ThreadLocal内存泄漏问题的方法还有2种,需要依据不同的使用场景: 使用不可变对象:ThreadLocal变量存储的对象最好是不可变的,因为不可变的对象不需要频繁更新,也不会因为被多个线程同时修改而出现线程安全问题。如果要修改一个ThreadLoc...
方案2:使用 Static 变量避免多个 ThreadLocal 实例 有时候,我们不希望 ThreadLocal 被 GC 过早回收,可以使用static 变量来持有它,确保 ThreadLocal 不会被回收: 不过,这种方式只适用于 ThreadLocal生命周期和应用一致的情况,否则可能会导致 ThreadLocal 变量不被回收,反而导致 OOM! 方案3:使用InheritableThreadLocal 如...
ThreadLocal<String> localName = new ThreadLocal(); localName.set("占小狼"); String name = localName.get(); 在线程1中初始化了一个ThreadLocal对象localName,并通过set方法,保存了一个值占小狼,同时在线程1中通过localName.get()可以拿到之前设置的值,但是如果在线程2中,拿到的将是一个null。
staticclassEntryextendsWeakReference<>{/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal k,Object v){super(k);value=v;}} ThreadLocal注意事项 上述原理可以看到,Entry继承了WeakReference,即Entry的key是弱引用,弱引用的特点是,如果这个对象只存在弱引用,那么在下一次垃圾回收...
1答:每个 Thread 对象中都持有一个 ThreadLocalMap 的成员变量。每个 ThreadLocalMap 内部又维护了N个 ...
接下来,我想先说说ThreadLocal的用法和使用场景,然后反问面试官3个关于ThreadLocal的话题。 使用方法和场景 一句话总结:ThreadLocal是给每个线程准备一份“独立的小空间”,它让每个线程都拥有自己独立的变量副本。在多个线程并发访问时,不用担心变量之间的冲突问题,避免了多线程之间的数据共享风险。
ThreadLocal 是必须要掌握的,这是因为 Looper 的工作原理,就跟 ThreadLocal 有很大的关系,理解 ThreadLocal 的实现方式有助于我们理解 Looper 的工作原理,这篇文章就从 ThreadLocal 的用法讲起,一步一步带大家理解 ThrealLocal。 考察的知识点 ThreadLocal的内部运行原理 ...
初始化一个独立的变量副本,只有该线程可以访问【get() or set()】该变量,ThreadLocal实例通常声明 为private static。 2.线程在存活并且ThreadLocal实例可被访问时,每个线程隐含持有一个线程局部变量副本,当线程生命周期 结束时,ThreadLocal的实例的副本跟着线程一起消失,被GC垃圾回收(除非存在对这些副本的其他引用) ...