队列中的方法,我不太了解这种方法的效果 :
@Override
public boolean offer(final T e) {
if (null == e) {
throw new NullPointerException("Null is not a valid element");
}
// local load of field to avoid repeated loads after volatile reads
final AtomicReferenceArray<Object> buffer = producerBuffer;
final long index = lpProducerIndex();
final int mask = producerMask;
final int offset = calcWrappedOffset(index, mask);
.......
}
calcWrappedOffset()方法:
private static int calcWrappedOffset(long index, int mask) {
return calcDirectOffset((int)index & mask);
}
private static int calcDirectOffset(int index) {
return index;
}
答案 0 :(得分:2)
你不明白的是什么?
这是来自SpscLinkedArrayQueue
我假设的,它使用功率为2的循环缓冲区。由于功率为2,包裹索引需要一个简单快速的二进制&#39;和&#39;使用mask = size - 1
值而不是重模数运算符。
原始JCTools版本允许跨越数组中的项目以减少错误共享效果,但RxJava决定不支持它以减少内存消耗,因此calcDirectOffset
返回未更改的索引。