为什么RingBuffer的getBufferSize()是int,remainingCapacity()是long?

Why is RingBuffer's getBufferSize() an int but remainingCapacity() is a long?

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

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

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

它似乎有效,但由于 getBufferSize() returns 一个 intremainingCapacity() returns 一个 long 我担心我忽略了一些东西。

有谁知道为什么 getBufferSize() returns 一个 intremainingCapacity() returns 一个 long?这对我来说没有意义,除非它是一个错误。

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

ringBuffer.remainingCapacity是一个long,因为它是在bufferSize的基础上减去producedconsumed计算出来的,如这里所见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,returning a 没有实际危害long,但 return 您拥有的类型只是稍微快一点,而不是强制转换可能不需要的用户。