为什么RingBuffer的getBufferSize()是一个int但是remainingCapacity()是一个多长的?

时间:2015-08-31 14:50:40

标签: java disruptor-pattern

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

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

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

它似乎有效,但由于getBufferSize()返回intremainingCapacity()返回long,我担心我会忽略某些事情。

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

1 个答案:

答案 0 :(得分:1)

注意:我不知道为什么作者不会转向int。但是,我可以告诉你为什么它需要long或者需要一个垂头丧气:

ringBuffer.remainingCapacitylong,因为它是根据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 都是 a long(并且需要),因此生成的数学也将是long

这只是我受过良好教育的猜测,但我认为由于性能原因他们不会向下转回到int,返回long并没有实际的伤害,但它只是略微更快地返回您拥有的类型,而不是强迫对可能不需要的用户进行强制转换。