7) 2021-11-20 学习记录,以面试回答口吻记录,拒绝八股 ThreadLocal 和 Fork、Join

**

一.ThreadLocal

**
1 使用场景: 解决线程(之间变量)的隔离,解决线程安全性,是一种线程私有的存储结构
主要有的API有 set(),get(),remove() java8新增初始化方法 withInitial
set() 是指在当前线程范围内,设置一个值存储到ThreadLocal中,这个值仅对当前线程可见,相当于在当前线程内建立了副本
底层是 有一个ThreadLocalMap 以创建threadLocal 的 Thread的引用为key,然后存储值,这个过程会涉及到hash冲突,内部采用的是线性探索,把value保存到Entry数组中,清理无效的key,如果当前Entry中的key为null,还回向前查找存在key失效的Entry,进行清理。
2 ThreadLocal内存泄漏的问题
①如果使用完没有进行remove()的话可能会有内存泄漏的,根据源码可知,get()和set() 方法中的 expungeStaleEntry()这个方法是帮助垃圾回收的,正常情况下是不会有内存泄漏的,但是如果没有调用,而且没调用remove()方法就会导致内存溢出。
②如果没有调用set,get,remove,线程结束的时候,也就没有强引用指向ThreadLocal中的ThreadLocalMap,这样ThreadLocal就会被还有里面的元素就会被回收,但是如果使用的是线程池创建的线程,线程执行完代码并没结束,只是把线程归还给线程池,这个时候ThreadLocalMap和里面的元素不会被回收。导致内存溢出。

二.Fork、Join

分别代表拆分和聚合任务
ForkJoinPool 用来运行 ForkJoinTask 的线程池
把任务submit到 ForkJoinTask中 ,两个方法分别是fork 异步执行task join 同步执行,可以获得返回值然后在聚合

猜你喜欢

转载自blog.csdn.net/qq_45095838/article/details/121443878
今日推荐