2020-12-09

currenthashmap 1.8

1. 计算hash值时在原有高16位异或低16位的基础上与0x7fffffff以减少hash冲突

2. 数组上的元素可能是代表链表头结点的Node,也可能是TreeBin,TreeBin中记录了红黑树的根节点

3. 使用unsafe类的cas方法直接原子性地操作内存,修改获取变量值

4. TreeBin的hash值等于-2,链表Node的hash值大于0

5. table初始化时使用懒加载,最初只是设置初始化容量大小。真正的初始化放在第一次执行put时

6. 特殊的Node:ForwardingNode的hash值等于-1,扩容时使用

7. sizeCtl最初的值是根据给定容量计算出来的2的整数次幂。实际初始化完成后赋值为数组的容量,为size*LOAD_FACTOR

8. table是volatile修饰的,只是异味着对table的赋值能保证内存的可见性。修改table中元素并不能保证可见性(volatile修饰的是引用,不是对象本身)

9. 扩容transfer的实现思路:设定一个步长,一个线程一次处理[length-步长,length]之间的节点。当其他线程帮助处理的时候通过修改TRANSFERINDEX指示当前处理的

数组元素范围。数组中的某个桶处理完成或者原先就是null,将桶替换成ForwardingNode

10. 扩容时节点要么在原先的桶,要么在原先index+原数组长度的桶里面。为了提高效率,会获取到从链表尾部开始最长的属于同一个桶的链表。直接链到新的桶里面。

11. [length-步长,length]之间的节点只会有一个线程处理,helptransfer只能重新设置步长,再处理自己对应的桶

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值