2

我正在编写一些单元测试代码,并且需要知道发布到破坏者的环形缓冲区的所有事件都已处理(如上所述,它仅适用于特定的测试用例)。

在研究了几个小时并没有找到任何优雅的解决方案后,我决定在测试用例中使用以下代码:

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

它似乎有效,但由于getBufferSize()返回 anintremainingCapacity()返回 along我担心我忽略了一些东西。

任何人都知道为什么getBufferSize()返回一个intremainingCapacity()返回一个long?这对我来说没有意义,除非它是一个错误。

4

1 回答 1

1

注意:我不知道为什么作者不将其转换为 int。但是,我可以告诉你为什么需要它long或者需要沮丧:

ringBuffer.remainingCapacity是 a 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。由于consumedproduced 都是long(并且必须是),因此得到的数学也将是long.

这只是我有根据的猜测,但我认为他们不会出于性能原因将其转换回 int ,返回 a 并没有实际危害long,但返回您拥有的类型会稍微快一些,而不是强制对用户进行强制转换可能不需要。

于 2015-08-31T15:30:20.480 回答