up:: ThreadLocal的主要方法
说明:
(1) 本篇博客,主要分析Thread,ThreadLocal,ThreadLocalMap的关系;同时,结合三者的关系,继续深化分析get(),set(),remove()方法;
一:Thread,ThreadLocal,ThreadLocalMap:三者的关系;
(1)一个Thread(线程)中,可能会持有多个ThreadLocal;
● 可以理解,如果某个任务中,我们想要保存多个对象呐?此时,就需要多个ThreadLocal:
(2)每个Thread(线程)中,都会有一个ThreadLocalMap成员变量;而Thread正式通过自己的ThreadLocalMap属性,来持有ThreadLocal的;
● ThreadLocalMap是一个<key,value的结构;key是ThreadLocal,value就是该ThreadLocal中存储的对象;
● 已知,一个Thread(线程)可能有多个ThreadLocal;那么,对于同一个Thread(线程)就可以使用一个ThreadLocalMap去保存【该线程中所有的ThreadLocal】,自然就会出现【一个ThreadLocalMap中,会存储多个ThreadLocal的情况】;
二:结合【Thread,ThreadLocal,ThreadLocalMap:三者的关系】进一步分析get(),set(),remove();
1.进一步分析:get()方法;
2.进一步分析:set()方法;
说明:
(1)(存疑) 通过set()方法的内容可以看出:【假设有1000个任务,线程池有10个线程,即每个线程平均会执行100个任务;】→【每个任务都想通过ThradLocal保存一个User对象;】→【那么某个线程第一次执行任务的时候,在ThreadLocalMap中,就会有这个键值对了:<当前线程的为了保存“任务中User对象”而创建的ThreadLocal,线程正在执行任务中的User对象值】→【那么当线程执行后续任务的时候,这个键值对不会“删除重添加”;而是,会只修改其value值为当前任务的User对象值】;换句话说,对于一个线程来说,其保存任务中某个对象的ThreadLocal是会一致不变的(PS:前提是没有调用remove()方法)
3.进一步分析:remove()方法;
三:ThreadLocalMap类;
(1)ThreadLocalMap类是定义在ThreadLocal中的,是ThreadLocal的一个成员内部类;
但,同时ThreadLocalMap还是Thread的成员变量;
(2)ThreadLocalMap类似于HashMap;
说明:
(1) 我们在某种程度上,可以把ThreadLocalMap看成一个HashMap;
(2) 但是,ThreadLocalMap在实现上,和HashMap略有不同;
● HashMap处理冲突;
● ThreadLocalMap处理冲突;(上图中的,只有一个next的那个就是ThreadLocalMap处理冲突的演示)
四: ThreadLocal两种使用场景中,使用方法的融汇;
(0) 第一种场景和第二种场景,虽然应用的场景不同;但是在底层的技术原理,是差不多的;
(1) 第一种场景:
● 先通过get()方法去初始化,但其最终会对应的ThreadLocalMap上;
● 第一种场景:适用于【对象的初始化不受外界影响】;比如工具类,我们可以在任何需要的地方,创建SimpleDateFormat对象;
(2) 第二种场景:
● 通过set()方法去初始化,其最终也会对应的ThreadLocalMap上;
● 第一种场景:适用于【对象的初始化不受外界影响】;比如工具类,我们可以在任何需要的地方,创建SimpleDateFormat对象;