我在这里阅读了在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);


有人请解释。

最佳答案

方法调用:

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


等效于普通数组访问segments[j],但可能更快,因为它不需要边界检查。 SBASE是数组segments中数组数据开始处的偏移量。 SSHIFT是数组索引刻度的log2,因此j << SSHIFT计算数组中索引j的原始字节偏移。

09-27 15:54