解释下面的concurrentHashmap的put(key,value)方法行?

时间:2013-09-05 15:43:07

标签: java collections hashmap concurrenthashmap

我正在阅读ConcurrentHashMap中插入键值对的实现。

我无法理解以下几行。

 int j = (hash >>> segmentShift) & segmentMask;
        if ((s = (Segment<K,V>)UNSAFE.getObject          // nonvolatile; recheck
             (segments, (j << SSHIFT) + SBASE)) == null) //  in ensureSegment
            s = ensureSegment(j);
        return s.put(key, hash, value, false);

有人请解释一下。

1 个答案:

答案 0 :(得分:1)

方法调用:

UNSAFE.getObject(segments, (j << SSHIFT) + SBASE)

等同于正常的数组访问segments[j],但可能更快,因为它不需要边界检查。 SBASE是数组数据在segments数组中开始的偏移量。 SSHIFT是数组索引标度的log 2 ,因此j << SSHIFT计算数组中索引j的原始字节偏移量。