共图社大白 大白共图社 5月30日
在上篇文章《读懂ThreadLocal》简单介绍了下有哪些角色,以及角色的定位,这篇文章将更加全面的介绍ThreadLocal为什么是个长工——苦逼的天生的打工仔。
ThreadLocal的源码有的人看过,也有的人没有看过,但是说到上篇文章的思考方式:面向对象的字段和方法的封装,更重要的是字段和方法的内部联系是什么?如何能更具体的去理解它?
ThreadLocal是个打工仔——长工
如果线程Thread是个拥有财富的地主的话,那么Thread Local就是财富的搬运工,是的,它不生产财富,它不消费财富,也不会拥有财富,它只是地主的长工。这些长工在大家族里为这个家的5个兄弟服务着:分别管理者自己对应编号的仓库,只要哪个大兄弟想要仓库的粮食或其他值钱的东西,他都会任劳任怨的去这个大兄弟的库房中给他搬运出来。
五个兄弟的各自10个库房——ThreadLocal.ThreadLocalMap
Thread线程对象就是通过ThreadLocal.ThreadLocalMap来管理它的数据仓库群的,也就是大兄弟的10个库房,而这个ThreadLocalMap是通过数组管理多个仓库Entry[] table,这个Entry就是一个数据仓库类,也就是说Thread通过ThreadLocalMap字段来引用着它名下的多个数据仓库,如下图:
悲伤的ThreadLocal——打工仔每天的工作内容
你们都知道我是个打工仔,对,我只是财富的搬运工,不管哪个大兄弟跟我说想要取出什么东西,我都会拿着对应编号的钥匙去这个大兄弟的仓库群中的对应编号的仓库给他搬出来,而且我还帮他搬东西到新的库房。我是怎么知道这个大兄弟的仓库集群的?请看下图的红色下划线内容。
对的,大兄弟的仓库群就是这个map。
下面是我搬进去的过程:
搬进去的时候,我也是同样方式得到大兄弟的仓库群的。
看到这里你也应该明白我是个打工仔的原因了吧! 大兄弟Thread的数据存放在它的仓库中,而我只是在Thread需要的时候给他拿出来,添加新的数据时候我给他搬进去。我是个打工仔,但我不是孤独的一个人,我有10个好哥们,他们跟我一起进出5个大兄弟的仓库群工作,各自管理者对应编号的仓库,而且我们很努力的在改变命运。
talk is cheap ,show you the code and the doc,更多的分享内容请关注我的工作号:大白共图社。公众号会有很多的github开源社区拿来即用项目源码以及相关的文章。欢迎关注。