今天无聊又去看看源码,有了2个思考。
1.为什么选择本身与高16位部分做运算
2.为什么选择异或算法
答:与右移16位后的本身做异或运算是为了让高16位也参与运算,使得结果更加的随机,不然基本大多数情况只有低位参与运算。而之所以选择异或运算,是因为,异或运算的结果更平均,例如1和0做异运算,(1和1,1和0,0和1,0和0)4种情况有3种结果是0,一种是1。或运算则1种结果为1,3种为0。而异或运算是2种结果为1,2种结果为0.更平均。 更加的随机+更加的平均。
总结:虽然没啥用,但是觉得很有意思
tips:
1.JDK1.8的hashmap在高并发下已经没有环形链表问题了别忘了。
2.ConcurrentHashMap的size()方法中引用的内部类CounterCell使用的@sun.misc.Contended注解是为了独占CPU的缓存行,避免伪共享影响性能。类似1.7的在类中填充变量达到64字节来实现一样的效果,但是考虑到JVM会对代码做优化,无用的代码可能会被删掉导致无效。所以1.8有了这样的优化。