背景
- 推荐阅读ThreadLocal 理解一:基础知识及其应用
- 推荐阅读ThreadLocal理解二:内存泄漏过程分析及其解决方案
- 推荐阅读ThreadLocal理解三:在线程池中使用存在的问题及其解决方案
- Thread和ThreadLocalMap关系是什么?
- ThreadLocal及其ThreadLocalMap相互之间的关系?
- ThreadLocalMap与Entry相互之间的关系?
- 在哪个环节上构建的关系?比如Thread中的ThreadLocalMap?
过程
-
类图关系
-
运行时数据布局
-
ThreadLocal结构设计布局
理解每个线程都私有ThreadLocalMap实例。 -
开发者自定义的ThreadLocal静态属性的意义?
a) 给当前线程的threadLocals赋值,也就是帮忙辅助生成ThreadLocalMap实例。
b)Entry中的k就是我们开发者自定义的ThreadLocal实例变量。是弱引用。
小结
-
记录与ThreadLocal相关的类图关系。
-
ThreadLocal运行时内存结构布局。
-
ThreadLocal内部的结构设计布局。
-
工作过程
a) 开发者自定义的ThreadLocal实例调用set()方法直接获取当前线程,然后直接获取当前线程的ThreadLocalMap实例。如果为空,则创建ThreadLocalMap实例并赋值给当前线程,并把值(T v)放入到map中的entry[]中;如果不为空,则直接set值即可。
b)开发者自定义ThreadLocal实例调用get()方法
直接获取当前线程,然后直接获取当前线程的ThreadLocalMap实例。如果为空,则设置初始值,这个设置初始值的逻辑是,先执行自己默认初始值设定,默认值是null,然后获取当前线程,然后获取当前线程的ThreadLocalMap实例,如果为空,则创建ThreadLocalMap实例并赋值给当前线程,并把值(T v)放入到map中的entry[]中;如果不为空,则直接获取值。
-
理解ThreadLocal相关类图关系,以及ThreadLocal内部结构设计布局和ThreadLocal在运行时数据的内存布局。而我们的工作过程,只是在这些基础上去构建相互之间的关系,也就是我们设计好基础组件,利用工作过程(工作原理)或者我们叫做所谓的算法,去组织和协调这些基础组件,让它们有序地完成自己相应的职能。