`
leonzhx
  • 浏览: 769531 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于ConcurrentHashMap 中位移的问题

    博客分类:
  • Java
阅读更多

拜读了GoldenDoc的大作:《Java并发编程之ConcurrentHashMap》后,有一个疑问:

 关于查找Segment位置的位操作,segment的位置由如下代码确定:

 

long u = ((h >>> segmentShift) & segmentMask);

 其中 SSHIFT 和 SBASE为静态常量,而segmentShift和segmentMask则是在构造函数中初始化的:

 

 

int sshift = 0;
int ssize = 1;
while (ssize < concurrencyLevel) {
       ++sshift;
       ssize <<= 1;
}
this.segmentShift = 32 - sshift;
this.segmentMask = ssize - 1;

 其中ssize是指的segment的个数,它是不小于concurrencyLevel的最小的2的幂,假设它是2^n,那segmentShift也就是 32-n,而segmentMask是 2^n-1。我们知道2^n-1在2进制中就是n位1,而Java的int型数据是32位。所以(h >>> segmentShift) 就是把h的最高n位移到最低n位,前32-n位为0。而segmentMask就是最低n位为1其他位为0的整数。这样(h >>> segmentShift)与(h >>> segmentShift) & segmentMask应该是一样的呀?为什么要多此一举呢?



 

 

  • 大小: 6.4 KB
  • 大小: 62 KB
  • 大小: 61.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics