这个方法的含义是什么calcWrappedOffset()

时间:2017-07-03 06:38:55

标签: queue rx-java

队列中的方法,我不太了解这种方法的效果 :

  @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;
}

1 个答案:

答案 0 :(得分:2)

你不明白的是什么?

这是来自SpscLinkedArrayQueue我假设的,它使用功率为2的循环缓冲区。由于功率为2,包裹索引需要一个简单快速的二进制&#39;和&#39;使用mask = size - 1值而不是重模数运算符。

原始JCTools版本允许跨越数组中的项目以减少错误共享效果,但RxJava决定不支持它以减少内存消耗,因此calcDirectOffset返回未更改的索引。