目录
系列索引
- Disruptor源码解析一 Disruptor高性能之道
- Disruptor源码解析二 Sequence相关类解析
- Disruptor源码解析三 RingBuffer解析
- Disruptor源码解析四 消费者的组织串联
- Disruptor源码解析五 消费者的具体实现
- Disruptor源码解析六 示例与性能压测
前言
-
前面篇章介绍了下Sequence相关类,这里主要介绍下集成了Sequence类的disruptor主要结构RingBuffer。
主要内容
类的继承结构:
类的主要成员:
RingBuffer的要点
避免缓存行伪共享
-
RingBufferFields中entries数组, 前后都加了缓存行填充避免伪共享。
预初始化
- entries预先都用工厂类进行了构造
集成了Sequencer
- 使用的是SingleProducerSequencer 或者 MultiProducerSequencer,进行生产和消费的管理
源码解析
类中的主要方法都是把Sequencer的方法封装了一下,基本没有什么复杂的逻辑,主要注意以下几点:
-
next()方法可能导致生产者永久阻塞,使用时需要保证消费者正常运行,自己改动生产者游标的时候(claim方法)一定要慎重,一般不建议改动。
- 使用ringBuffer发布,建议使用try-finally模式,即通过next拿到了一个sequence,必须通过RingBuffer发布出去,否则可能会导致整个数据结构不可用。
long sequence = ringBuffer.next();
try {
Event e = ringBuffer.get(sequence);
// Do some work with the event.
} finally {
ringBuffer.publish(sequence);
}