c ringbuffer 源码_Disruptor源码(一)RingBuffer的诞生过程可是由“管家”一手操办的哟...

RingBuffer采用环形数组存储元素,使用预加载技术减少对象创建开销。Sequencer负责管理RingBuffer的核心信息如bufferSize等,不同Sequencer子类提供多样化的服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RingBuffer源码核心

底层用数组Object[] entries存储元素,不会扩容,满了之后从数组头开始填充,所谓环形数组;

内存预加载,在RingBuffer初始化的时候,就用空Event对象填充entries,初始化后不再新建Event对象 ,消除了不断new对象带来的开销,只对entries中的Event对象做update操作;

RingBufferFields

其作为RingBuffer的父类,维护了RingBuffer中最核心的数据结构;

组合了一个Sequencer,由构造器传入;

RingBuffer中用于存放元素的数组是维护在它里面的,private final Object[] entries;

RingBuffer中的bufferSize是维护在它里面的,是由Sequencer赋值的,protected final int bufferSize;

Sequencer

要明确一件事情,RingBuffer和Sequencer和是有组合关系的,Sequencer向RingBuffer提供服务,不同的子类提供不同的服务;

Sequencer作为RingBuffer服务者,要知道RingBuffer的相关信息,这些信息包括:bufferSize,waitStrategy,cursor,gatingSequences;

在初始化其子类时(MultiProducerSequencer),需要传入bufferSize,RingBuffer的bufferSize也是由Sequencer的子类初始化的,Sequencer的子类是知道RingBuffer的bufferSize的,Sequencer有点像RingBuffer的管家,关它的初始化,取,存等;

那么1个Sequencer和1个RingBuffer起码有个对应关系;

RingBufferFields组合了Sequencer,两者之间的关系是在抽象层建立的;

AbstractSequencer

这是实现Sequencer接口的抽象类,Sequencer作为RingBuffer的服务提供者,RingBuffer中的相关信息是维护在AbstractSequencer中的,包括:bufferSize,waitStrategy,cursor,gatingSequences;

SingleProducerSequencer

作为Sequencer的具体实现,向RingBuffer提供服务单生产者模式下的服务;

其在服务的过程中,RingBuffer中的相关消息它是可以知道的,在其父类AbstractSequencer中维护;

RingBuffer的构造过程

0)客户端代码

RingBuffer ringBuffer =

RingBuffer.create(

ProducerType.MULTI,

new EventFactory() {

public Order newInstance() {

return new Order();

}

},

1024 * 1024,

new YieldingWaitStrategy());

1)RingBuffer#create - 根据producerType决定创建哪一种Sequencer

producerType:决定了创建Sequencer的具体类型,具体的Sequencer用于初始化RingBuffer;

factory:用于初始化RingBuffer;

bufferSize:创建具体Sequencer用;

waitStrategy:创建具体Sequencer用;

public static RingBuffer create(ProducerType producerType,

EventFactory factory,

int bufferSize,

WaitStrategy waitStrategy)

{

switch (producerType)

{

case SINGLE:

return createSingleProducer(factory, bufferSize, waitStrategy);

case MULTI:

return createMultiProducer(factory, bufferSize, waitStrategy);

default:

throw new IllegalStateException(producerType.toString());

}

}

2)RingBuffer#createMultiProducer - 创建具体类型的Sequencer,并用具体Sequencer创建RingBuffer

factory:用于初始化RingBuffer;

bufferSize:创建具体Sequencer用;

waitStrategy:创建具体Sequencer用;

public static RingBuffer createMultiProducer(EventFactory factory,

int bufferSize,

WaitStrategy waitStrategy)

{

MultiProducerSequencer sequencer = new MultiProducerSequencer(bufferSize, waitStrategy);

return new RingBuffer(factory, sequencer);

}

3)RingBuffer#RingBuffer - 调用父类RingBufferFields的构造方法

RingBuffer(EventFactory eventFactory,

Sequencer sequencer)

{

super(eventFactory, sequencer);

}

4)RingBufferFields#RingBufferFields - 初始化RingBuffer中的数组

用sequencer初始化sequencer,bufferSize,indexMask等成员变量;

开辟了entries的大小;

向entries中填充空Event,用EventFactory;

RingBufferFields(EventFactory eventFactory,

Sequencer sequencer)

{

this.sequencer = sequencer;

this.bufferSize = sequencer.getBufferSize();

if (bufferSize < 1)

{

throw new IllegalArgumentException("bufferSize must not be less than 1");

}

if (Integer.bitCount(bufferSize) != 1)

{

throw new IllegalArgumentException("bufferSize must be a power of 2");

}

this.indexMask = bufferSize - 1;

this.entries = new Object[sequencer.getBufferSize() + 2 * BUFFER_PAD];

fill(eventFactory);

}

5)RingBufferFields#fill - 实现内存预加载的代码

eventFactory:调用RingBuffer#create时传入的EventFactory类;

注意:初始化对entries的填充,entries的两头各空了BUFFER_PAD个空间;BUFFER_PAD的大小跟计算出来的scale有关,scale表示Object[]数组的比例因子;BUFFER_PAD等于32或16

private void fill(EventFactory eventFactory)

{

for (int i = 0; i < bufferSize; i++)

{

entries[BUFFER_PAD + i] = eventFactory.newInstance();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值