ThreadLocal中的一些细节

本文探讨了ThreadLocal内存泄漏之外的重要细节,分析了ThreadLocalMap采用开放地址法而非链地址法解决哈希冲突的原因,包括神奇数字0x61c88647的作用,以及在replaceStaleEntry和expungeStaleEntry方法中的策略。ThreadLocal通常用于存储数量不多的数据,开放地址法在这种场景下提供了更好的空间效率和查询性能。
摘要由CSDN通过智能技术生成

     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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值