ThreadLocal中不止是有内存泄漏的问题,源码中还有很多值得研究的细节。包括线性探测法怎么解决数据重复问题等。
源码分析
ThreadLocal, ThreadLocalMap和Thread的关系图如下:
为什么ThreadLocalMap采用链地址法来解决Hash冲突?
Jdk中大部分采用链地址法来解决hash冲突,但是ThreadLocalMap采用开放地址发来解决哈希冲突。
链地址法和开放地址法优缺点:
开放地址法:
1. 容易产生堆积问题,不适用于大规模的数据存储
2. 散列函数的设计对冲突会有很大影响,插入时会出现多次冲突现象
3. 删除的元素是多个冲突元素中的一个,需要对后面的元素作处理,实现较复杂。
链地址法:
1. 处理冲突简单,无堆积现象,平均查找长度短
2. 链表中的节点时动态申请的,适合构造表不能确定长度的情况
3. 删除节点操作易于实现。只要简单地删除链表上对应的节点即可
4. 指针需要额外的空间,故当节点规模较小时,开放地址法较为节省空间。
ThreadLocal采用开放地址法的原因:
1. ThreadLocal 中看到一个属性 HASH_INCREMENT = 0x61c88647 ,0x61c88647 是一个神奇的数字,让哈希码能均匀的分布在2的N次方的数组里, 即 Entry[] ta