2017-07-03 8 views
0

私はかなりこの方法 の効果を理解していないキュー、提供中の方法:この方法calcWrappedOffset(の意味は何ですか)

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

答えて

2

あなたが理解していないことは何ですか?

投稿者:SpscLinkedArrayQueue私は、2サイズの累乗を持つ循環バッファを使用しています。 2のべき乗であるため、インデックスをラップするには、重いモジュロ演算子の代わりにmask = size - 1の値を持つシンプルで高速なバイナリ 'と'が必要です。

オリジナルのJCToolsバージョンでは、アレイ内の項目をスパンアウトして誤った共有効果を減らすことができましたが、メモリ消費を減らすためにRxJavaがサポートしていないため、変更されていないインデックスが返されます。calcDirectOffset

+0

ありがとうございます。私はもっ​​と学ぶ必要があるかもしれません... – zhangle

関連する問題