ThreadLocal分析

Thread类有一个类型为ThreadLocal.ThreadLocalMap的实例变量threadLocals,也就是说每一个线程有一个本身的ThreadLocalMap。ThreadLocalMap有本身的独立实现,能够简单地将它的key视做ThreadLocal,value为代码中放入的值(实际上key并非ThreadLocal自己,而是它的一个弱引用)。每一个线程在往某个ThreadLocal里塞值的时候,都会往本身的ThreadLocalMap里存,读也是以某个ThreadLocal做为引用,在本身的map里找对应的key,从而实现了线程隔离。数组

 

ThreadLocalMap节点继承弱引用?优化

由于若是这里使用普通的key-value形式来定义存储结构,实质上就会形成节点的生命周期与线程强绑定,只要线程没有销毁,那么节点在GC分析中一直处于可达状态,没办法被回收,而程序自己也没法判断是否能够清理节点。弱引用是Java中四档引用的第三档,比软引用更加弱一些,若是一个对象没有强引用链可达,那么通常活不过下一次GC。当某个ThreadLocal已经没有强引用可达,则随着它被垃圾回收,在ThreadLocalMap里对应的Entry的键值会失效,这为ThreadLocalMap自己的垃圾清理提供了便利。线程

 

ThreadLocalMap中entry的大小必须为2的幂?对象

因为ThreadLocalMap使用线性探测法来解决散列冲突,因此实际上Entry[]数组在程序逻辑上是做为一个环形存在的。继承

ThreadLocalMap使用的是线性探测法,均匀分布的好处在于很快就能探测到下一个临近的可用slot,从而保证效率。这就回答了上文抛出的为何大小要为2的幂的问题。为了优化效率。生命周期

相关文章
相关标签/搜索