Disruptor源码分析之初始化

本文深入探讨Disruptor如何通过初始化解决伪共享问题,以提高并发性能。核心是RingBuffer的创建,它使用填充策略优化缓存行。初始化涉及EventFactory、等待策略(如BlockingWaitStrategy)、多生产者支持和消费者处理逻辑。通过ProcessingSequenceBarrier、WorkProcessor和ConsumerRepository管理消费端,确保数据安全和高效处理。
摘要由CSDN通过智能技术生成

Disruptor的核心是解决伪共享,通过给填充整个缓存行来达到提高缓存命中率以及提高并发。通过一个环状数据结构实现RingBuffer。主要使用的方式如下,一个存储数据的RingBuffer,一个执行消费的线程生成器。


public Disruptor(final EventFactory<T> eventFactory, final int ringBufferSize, final ThreadFactory threadFactory)
{
    this(RingBuffer.createMultiProducer(eventFactory, ringBufferSize), new BasicExecutor(threadFactory));
}

创建支持多生产者的对应大小的RingBuffer,以及需要存储的初始对象EventFactory,初始化消费端常用的等待策略BlockingWaitStrategy,当然还有其他几种策略可以配置。


public static <E> RingBuffer<E> createMultiProducer(EventFactory<E> factory, int bufferSize)
{
    return createMultiProducer(factory, bufferSize, new BlockingWaitStrategy());
}

public static <E> RingBuffer<E> createMultiProducer(
    EventFactory<E> factory,
    int bufferSize,
    WaitStrategy waitStrategy)
{
    MultiProducerSequencer sequencer = new MultiProducerSequencer(bufferSize, waitStrategy);

    return new RingBuffer<E>(factory, sequencer);
}

初始化提供者的定序器,bufferSize大小必须是2的幂次方,这样在获取环状位置时就可以直接使用位运算替代取余。availableBuffer这个数组是保存对应的RingBuffer数组的对象是否可用的标志,与真实的存储数据是一一对应的。

public MultiProducerSequencer(int bufferSize, final WaitStrategy waitStrategy)
{
    super(bufferSize, waitStrategy);
    availableBuffer = new int[bufferSize];
    indexMask = bufferSize - 1;
    indexShift = Util.log2(bufferSize);
    initialiseAvailableBuffer();
}

public AbstractSequencer(int bufferSize, WaitStrategy waitStrategy)
{
    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.bufferSize = bufferSize;
    this.waitStrategy = waitStrategy;
}

 

给标志位数组设置不可用初始值,SCALE = UNSAFE.arrayIndexScale(int[].class)为数组元素的占位大小,BASE = UNSAFE.arrayBaseOffset(int[].class)代表该数组所在的偏移量


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值