我在这里阅读了在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
的原始字节偏移。