2019-06-25:谈谈ThreadLocal用法和原理?
MoJieBlog opened this issue · comments
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面试点:
- 结构(以ThreadLocal.get分析,从当前线程Thread对象取得ThreadLocalMap,ThreadLocalMap根据ThreadLocal对象取出Value)
- ThreadLocalMap的哈希存储结构(开放寻址法)
- ThreadLocalMap对ThreadLocal弱引用的原因
- 什么情况会引起内存泄漏?
- 脏数据回收
ThreadLocal 主要用来Thread的数据存储,且每个Thread互不影响。底层是通过map来进行存储的。ThreadLocal 在保存数据时 会获取当前操作的线程,然后将数据保存在当前线程的 ThreadLocalMap 中,以当前的对象为键,数据为值,进行保存。get方法同理。