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对象;