`

Disruptor 源码分析(5) 一个生产者和多个生产者的区别

 
阅读更多
disruptor一个生产者和多个生产者的区别

一个生产者的时候用的是SingleProducerSequencer,多个的时候用的是MultiProducerSequencer.

上一篇文章说到了他们在isAvailable方法上的不同,
SingleProducerSequencer直接用cursor去判断,应为只有一个生产者的cursor,所以是没问题的.

public boolean isAvailable(long sequence)
    {
        return sequence <= cursor.get();
    }


但是MultiProducerSequencer时候,每一个生产者都有cursor,disruptor采取的做法是用一个数组来存.
而且这个数组的大小和RingBuffer的大小是一样的.因为数组的一个位置只会由一个生产者获取,而且一个位置只能被某一圈的时候获取.
(获取一个位置两次,表示一个生产者从后面追上另外一个生产者,这个是不允许的.)


这里说说他们next方法的不同:
SingleProducerSequencer,完全不同sequence来表示位置,而是用了Padding类,缓存同样也用的是Padding类

  private static class Padding
    {
        public long nextValue = Sequence.INITIAL_VALUE, cachedValue = Sequence.INITIAL_VALUE, p2, p3, p4, p5, p6, p7;
    }


可以看到Padding的p2到p7是没用的,只是为了凑够64字节.因为cpu的缓存是64字节.这样做是为了避免缓存失效.Sequence类也做了同样的事情
可以看到Padding不是线程安全的,但是对于SingleProducerSequencer来说,只有一个生产者,足够了.


MultiProducerSequencer的next方法用cursor(Sequence类)来表示位置信息.用gatingSequenceCache(Sequence类)来缓存位置信息,这是为什么呢.
来看看Sequence类吧

public long get()
    {
        return UNSAFE.getLongVolatile(paddedValue, VALUE_OFFSET);
    }

 public void set(final long value)
    {
        UNSAFE.putOrderedLong(paddedValue, VALUE_OFFSET, value);
    }

可以看到Sequence类是线程安全的,在MultiProducerSequencer 多个生产者的情况下必须要保障线程安全的.


但是说了这么多,感觉disruptor不可能会出现多个生产者.为什么呢.
在RingBuffer的构造函数中只能传入一个Sequencer对象,一个对象怎么多个生产者.
而且Sequencer不是线程类,完全没办法多线程.
难道是我哪里没看明白吗?

分享到:
评论
3 楼 PopsPlanet 2015-08-01  
sequencer是被多个publisher share的
2 楼 PopsPlanet 2015-08-01  
[size=xx-large][size=xx-large] sequencer是被多个publisher share的 ?why?[/size][/size]
1 楼 zjm84812 2014-01-26  
你可以跑一下TortureTest, sequencer是被多个publisher share的

相关推荐

    LMAX disruptor jar包+Demo+Api+src源码 disruptor-3.0.1.jar

    - 一个简单的Disruptor示例通常包括创建Disruptor对象、初始化Ring Buffer、设置Producer和Consumer,以及启动处理循环。通过示例,开发者可以快速上手,理解Disruptor的工作流程。 综上所述,LMAX Disruptor是一...

    Disruptor应用实例

    例如,创建一个生产者线程发布消息,多个消费者线程并行处理,观察其性能提升。 6. **工具支持** 在实际开发中,我们通常会使用构建工具(如Maven或Gradle)来管理和构建项目。`.settings`目录可能包含Eclipse的...

    无锁队列Disruptor超详细教程

    Disruptor适用于多种并发场景,如单生产者多消费者并行、多生产者单消费者、多生产者多消费者竞争、多个消费者串行消费、菱形执行、链式并行执行、多组消费者相互隔离以及六边形执行顺序等。不同的场景需要结合...

    Java工具:高性能并发工具Disruptor简单使用

    Disruptor还引入了事件处理器链,使得多个消费者可以同时处理一个事件,进一步提升了处理效率。 使用Disruptor的步骤大致如下: 1. **创建Event**: 定义事件类,它是Disruptor中的基本数据单元,用于传递信息。 `...

    Disruptor并发框架

    在Disruptor中,每个生产者和消费者都有一个唯一的Sequence,用于跟踪它们对环形缓冲区的处理进度。Sequence之间的依赖关系由Barrier来维护,确保数据的正确顺序。当生产者的Sequence达到特定值时,消费者才能继续...

    无锁队列

    每个生产者和消费者都有自己的Sequence,它们之间的差值可以用来判断是否有新的消息可供消费。此外,Disruptor还采用了事件处理器链(Event Processor Chain)的概念,使得多个消费者可以并行处理队列中的事件,...

    java并发框架源码-notes:记录各种学习笔记(Java、算法、框架、数据库、并发、源码...)

    学习并发框架源码还需要理解一些经典并发编程模式,如生产者消费者模型、双端队列、工作窃取等,这些模式在很多并发框架中都有应用。 7. **并发工具类**: `Future`和`Callable`接口提供了异步计算的能力,`...

    mpmc

    在多线程环境下,多个生产者线程可以同时向队列添加元素,而多个消费者线程也可以同时从中取出元素,这种设计模式提高了系统的并行处理能力。 在Java中,JDK的Concurrent包并没有提供原生的MPMC队列实现。然而,有...

    Utilities:开源应用程序的集合

    【标题】"Utilities:开源应用程序的集合" 涉及的知识点主要集中在开源软件和特定的编程技术上,包括Facebook广告API、基于Disruptor的Messaging API以及Apache Kafka的生产者实现。 首先,"开源应用程序的集合"指的...

Global site tag (gtag.js) - Google Analytics