2017-07-03 7 views
0

Verfahren in einer Warteschlange, Angebot, das ich nicht ganz verstehen, die Wirkung dieser Methode :Was ist die Bedeutung dieser Methode calcWrappedOffset ist()

@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() -Methode:

private static int calcWrappedOffset(long index, int mask) { 
    return calcDirectOffset((int)index & mask); 
} 
private static int calcDirectOffset(int index) { 
    return index; 
} 

Antwort

2

Was verstehen Sie nicht?

Dies ist von der SpscLinkedArrayQueue Ich nehme an, die kreisförmigen Puffer mit der Macht der Größe 2 verwendet. Aufgrund der Zweierpotenz erfordert das Umbrechen des Indexes eine einfache und schnelle binäre 'und' mit dem Wert anstelle des schweren Modulooperators.

Die ursprüngliche JCTools-Version erlaubte das Verteilen von Elementen im Array, um die falschen Austauscheffekte zu reduzieren, aber RxJava entschied sich, dies nicht zu unterstützen, um den Speicherverbrauch zu reduzieren. Daher gab der calcDirectOffset den unveränderten Index zurück.

+0

Vielen Dank. Ich muss vielleicht mehr lernen ... – zhangle