Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-06-25:谈谈ThreadLocal用法和原理?

MoJieBlog opened this issue · comments

2019-06-25:谈谈ThreadLocal用法和原理?

ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。

1、ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。

2、ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。

3、ThreadLocal.remove: 移除ThreadLocal中当前线程共享变量的值。

4、ThreadLocal.initialValue: ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值。

楼上说的挺好
我们注意一点就行了
1.ThreadLocal不是线程

ThreadLocal 用来保存数据,且每个线程之间互不影响,比如 在主线程保存了一个 对象,但是在子线程中 就无法找到这个对象。

ThreadLocal 是一个线程内部的数据存储类,通过他可以指定线程中存储的数据,在读取时,只有指定的线程才可以读取到数据,其他线程无法拿到数据。

ThreadLocal 在保存数据时 会获取当前操作的线程,然后将数据保存在当前线程的 ThreadLocalMap 中,以当前的对象为键,数据为值,进行保存。

ThreadLoca 在获取数据时,和保存非常相似,都是拿到当前的线程对象,然后去判断 线程对象的 ThreadLocalMap 是否为空,如果为空,则 没有数据,否则 则获取数据。

从ThreadLocal的set 和 get 方法可以看出,他们操作的都是根据当前线程中的ThreadLocal.ThreadLocalMap threadLocals = null 来判断当前线程有没有保存数据,如果保存了,就会在当前线程中产生一个ThreadLocalMap 的对象 。数据就会保存在这个对象 里面,如果 没有保存过数据,那么当前线程中的ThreadLocalMap 就会为空。他们对ThreadLocal 所做的读/写操作仅限于线程的内部。因此在不同线程中访问同一个ThreadLocal的 set 和 get 方法 所得到的值 也是不一样的。

源码分析:https://blog.csdn.net/baidu_40389775/article/details/86759882

ThreadLocal用来保存数据,每个线程之间不影响。
用get ,set,和remove来操作里面的数据
它在保存数据的时候首页获取到当前线程,然后将数据保存在当前线程的ThreadMap中,以当前的对象为键,数据为值得格式保存。

ThreadLocal面试点:

  1. 结构(以ThreadLocal.get分析,从当前线程Thread对象取得ThreadLocalMap,ThreadLocalMap根据ThreadLocal对象取出Value)
  2. ThreadLocalMap的哈希存储结构(开放寻址法)
  3. ThreadLocalMap对ThreadLocal弱引用的原因
  4. 什么情况会引起内存泄漏?
  5. 脏数据回收

参考资料:https://www.jianshu.com/p/dde92ec37bd1

ThreadLocal 主要用来Thread的数据存储,且每个Thread互不影响。底层是通过map来进行存储的。ThreadLocal 在保存数据时 会获取当前操作的线程,然后将数据保存在当前线程的 ThreadLocalMap 中,以当前的对象为键,数据为值,进行保存。get方法同理。