2

いくつかの単体テスト コードを書いており、ディスラプターのリング バッファーに発行されたすべてのイベントが処理されたことを知る必要があります (前述のように、特定のテスト ケースのみを対象としています)。

数時間調査しても洗練された解決策が見つからなかった後、テスト ケースで次のコードを使用することにしました。

while (ringBuffer.getBufferSize() > ringBuffer.remainingCapacity()) {
    Thread.yield();
}

動作しているように見えgetBufferSize()ますが、 anintremainingCapacity()返し、 alongを返すので、何かを見落としているのではないかと心配しています。

を返し、?を返す理由getBufferSize()は誰でも知っています。バグでない限り、私には意味がありません。intremainingCapacity()long

4

1 に答える 1

1

注: 著者が int にキャストしない理由がわかりません。ただし、なぜそれが必要なのか、longまたはダウンキャストが必要なのかを説明できます。

ringBuffer.remainingCapacityは、longに基づいて計算されるためbufferSize、 の減算producedと加算が次の図consumedに示されていMultiProducerSequencerます。

/**
 * @see Sequencer#remainingCapacity()
 */
@Override
public long remainingCapacity()
{
    long consumed = Util.getMinimumSequence(gatingSequences, cursor.get());
    long produced = cursor.get();
    return getBufferSize() - (produced - consumed);
}

getBufferSize ですint。_ consumedとの両方produced であるlong(そしてそうである必要がある) ため、この結果の計算も になりますlong

これは私の経験に基づいた推測ですが、パフォーマンス上の理由から int にダウンキャストしないと想定していlongます.それは必要ないかもしれません。

于 2015-08-31T15:30:20.480 に答える