1

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

有人请解释一下。

4

1 回答 1

1

方法调用:

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

相当于普通的数组访问segments[j],但可能更快,因为它不需要边界检查。SBASE是数组数据在数组中开始位置的偏移量segments。是数组索引比例的SSHIFTlog 2j << SSHIFT ,因此计算数组中索引的原始字节偏移量j

于 2013-09-05T16:05:26.560 回答