我正在编写一些单元测试代码,并且需要知道发布到干扰器环形缓冲区的所有事件都已经过处理(如上所述,它只适用于特定的测试用例)。
经过几个小时的研究而没有找到任何优雅解决方案后,我决定在测试用例中使用以下代码:
while (ringBuffer.getBufferSize() > ringBuffer.remainingCapacity()) {
Thread.yield();
}
它似乎有效,但由于getBufferSize()
返回int
而remainingCapacity()
返回long
,我担心我会忽略某些事情。
任何人都知道为什么getBufferSize()
会返回int
而remainingCapacity()
会返回long
?它对我来说没有意义,除非它是一个错误。
答案 0 :(得分: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
都是 a long
(并且需要),因此生成的数学也将是long
。
这只是我受过良好教育的猜测,但我认为由于性能原因他们不会向下转回到int,返回long
并没有实际的伤害,但它只是略微更快地返回您拥有的类型,而不是强迫对可能不需要的用户进行强制转换。