我正在阅读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);
有人请解释一下。
答案 0 :(得分:1)
方法调用:
UNSAFE.getObject(segments, (j << SSHIFT) + SBASE)
等同于正常的数组访问segments[j]
,但可能更快,因为它不需要边界检查。 SBASE
是数组数据在segments
数组中开始的偏移量。 SSHIFT
是数组索引标度的log 2 ,因此j << SSHIFT
计算数组中索引j
的原始字节偏移量。