ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习

背景

  1. 为什么选择此魔数?

过程

  • 源代码
    ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习_第1张图片

  • 例子演示及其结果
    ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习_第2张图片
    长度为16: 7 14 5 12 3 10 1 8 15 6 13 4 11 2 9 0

    长度为32: 7 14 21 28 3 10 17 24 31 6 13 20 27 2 9 16 23 30 5 12 19 26 1 8 15 22 29 4 11 18 25 0

    长度为64: 7 14 21 28 35 42 49 56 63 6 13 20 27 34 41 48 55 62 5 12 19 26 33 40 47 54 61 4 11 18 25 32 39 46 53 60 3 10 17 24 31 38 45 52 59 2 9 16 23 30 37 44 51 58 1 8 15 22 29 36 43 50 57 0

    结论长度是2的N次方的,散列出来,没有重复的。

  • 修改长度
    ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习_第3张图片
    结果
    ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习_第4张图片
    结论散列出来有很多重复的。

  • 魔数的来源
    ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习_第5张图片
    结果
    在这里插入图片描述
    这个魔数恰好与长度为2的N次方的数,散列出来的结果不会重复。

    设计者会为什么会考虑这样的实现呢?也就是他为什么能够想到这样的实现?还是说他的数学功底很扎实,知道这样散列是完美的?

小结

  1. hashCode = i * HASH_INCREMENT + HASH_INCREMENT,每次新增ThreadLocal实例到Entry[],自增0x61c88647。
  2. 元素散列位置(数组下标)= hashCode & (length-1)
  3. 长度是源代码给定的,用户不能设置。默认是16,每次扩容是原来的2倍。必须满足这样的扩容,才能满足散列出来的结果,没有重复的。

你可能感兴趣的:(并发编程艺术)