`
bruce008
  • 浏览: 172917 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Disruptor 模式简单理解

 
阅读更多

Disruptor   主要用作进程间高效通信的一种模式, 它里面所有的实现都是围绕着怎样做可以high performance。 它的核心是 RingBuffer,其实就是一个事先分配好的数组。  这样做有几个好处:

 

   1,  GC友好, 事先分配好内存就避免了linkedqueue 那样不断的分配释放内存。 使用每一个单元的话步骤是先claim; 拿到claim 到得 单元, 使用copy的方式 将数据拷贝到那个单元; 然后发表那个单元。

 

   2,  这个Buffer 里面的单元都有一个sequence,  我的理解就是版本号。   64位long 是从-1 初始值开始永远增长下去。  为了这个sequence,  Disruptor 专门定义了一个 Sequence 类, 在它里面:

      private volatile long p1 = 7L, p2 = 7L, p3 = 7L, p4 = 7L, p5 = 7L, p6 = 7L, p7 = 7L,

                          value = Sequencer.INITIAL_CURSOR_VALUE,

                          q1 = 7L, q2 = 7L, q3 = 7L, q4 = 7L, q5 = 7L, q6 = 7L, q7 = 7L;

 

   其实真正有用的就是那个 value 域。  但是为什么value 的前后各自放了 7个 long 型的域呢。  在它的设计人员里面的博客里面有说明, 按照java 的内存模型一个对象的域会按它们的类型而不是定义顺序放在一起。 通常每64个byte 的内存内容叫做一个cache line, 机器得内存, L1, L2, L3 cache 之间内容交换都是按照cache line 级别来做的。 这样value 两边padding 了就避免了一个sequence 对象跟别的对象在cache 中False Sharing。  跑了些Disruptor 里面的unit test ,发现确实有很大差异。

 

    3,  那边如何做到 producer/ consumer 协调工作呢 在 RingBuffer的超类中定义了  claimStrategy/waitStrategy.  Producer 使用的是claimStrategy, 当然consumer 使用的就是 waitStrategy 了。 一个最基本的原则就是 producer 的sequence  - bufferSize  不能小于所有的 consumer 的sequence。也就是说没有wrapping。 如果小于也就是producer 要等待, 否则就是有空间可以producer。  在具体怎么等待的Strategy 上, 它给出了3种方式: Busy Spin  (也就是spin 循环) , Yield (Thread.yield) ,  Block.  

 

 

    结合着Java 的内存, 线程模型 JSR 133 来看感觉不管是对 133 还是这个模式都有帮助。 现在盗用一张 Disruptor

 1.0 的关于RingBuffer的类图如下:

    Ring Buffer

 

 

 

  • 大小: 54.9 KB
分享到:
评论

相关推荐

    Disruptor专题简单案例资料

    这个“Disruptor专题简单案例资料”很可能包含了一些基础的使用示例和概念解释,帮助我们理解Disruptor的工作原理和优势。 在Java并发编程中,线程之间的通信通常依赖于共享内存,这可能导致竞态条件、死锁等问题,...

    disruptor案例加简单说明

    简单讲解disruptor并附上demo

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

    Java工具:高性能并发工具Disruptor简单使用 在Java编程中,高效并发处理是优化系统性能的关键之一。Disruptor,由LMAX公司开源的一款并发框架,为处理高并发场景提供了一种新颖且高效的解决方案。它通过消除锁和...

    springboot整合Disruptor并发编程框架 #资源达人分享计划#

    此外,Disruptor还提供了多种序列化策略,如单生产者、多生产者以及工作窃取模式,可以根据实际应用场景选择合适的策略。对于SpringBoot来说,可以结合AOP(面向切面编程)或者Spring的事件驱动模型,灵活地将...

    Disruptor并发框架中文参考文档

    ### Disruptor并发框架知识点详解 #### 一、Disruptor简介及原理 **Disruptor** 是一款高性能、低延迟的并发框架,它通过无锁设计实现了高效的队列操作,从而大大提升了多线程环境下的性能表现。该框架于2011年...

    spring-boot-starter-disruptor.zip

    通过深入理解和使用Spring Boot Starter Disruptor,开发者不仅可以充分利用Disruptor的高性能特性,还能保持代码的简洁性和可维护性。这使得在处理高并发、大数据量的业务场景时,Spring Boot应用能够展现出卓越的...

    DisruptorDemo.zip

    "DisruptorDemo.zip"的实例代码为我们提供了学习和理解Disruptor的一个良好起点,通过实际操作,我们可以更直观地感受Disruptor的强大性能。在实际项目中,尤其是对于需要处理大量并发请求的系统,Disruptor是一个...

    Disruptor demo

    Disruptor是一款高性能的并发工具库,由LMAX公司开发并开源,主要...这个示例将帮助你理解Disruptor如何简化并发编程,提高程序运行效率,尤其对于需要处理大量并发请求的高性能应用来说,Disruptor是一个强大的工具。

    disruptor jar包+Demo+Api

    `api` 文件可能包含的是 Disruptor 的API文档,提供了详细的接口说明和使用指南,对于理解和使用 Disruptor 非常有帮助。 Disruptor 的核心组件包括生产者(Producer)、消费者(Consumer)和 Ring Buffer。生产者...

    Disruptor3.x Disruptor使用方式

    Disruptor3.x Disruptor使用方式 EventHandler[] eventHandlers=new DisruptorEventHandler[]{new DisruptorEventHandler()}; DisruptorPublisher dp=new DisruptorPublisher(1024, eventHandlers); dp.start(); ...

    disruptor-3.4.4.jar disruptor 3.4.4 jar 官方github下载

    disruptor-3.4.4.jar 官方github下载 亲测可用,大家赶紧下载吧 后续再补充其他常用jar(但不好下载的)

    disruptor 多个消费者

    在"Disruptor 多个消费者"的场景中,我们可以深入理解Disruptor如何处理多个消费者同时消费消息,但又确保每个消息仅被消费一次的问题。 Disruptor的核心是一个环形缓冲区(Ring Buffer),它是一个固定大小的数组...

    Disruptor C++版(仅支持单生产者)

    此外,理解并运用Disruptor的事件处理模式和设计原则,能够帮助你构建出高并发、低延迟的应用系统。 总之,Disruptor C++版是一个强大的工具,对于需要处理大量并发事件的系统,它是优化性能的有效手段。通过掌握其...

    Disruptor应用实例

    通过创建一个简单的Disruptor应用,我们可以看到如何配置环形缓冲区、定义事件处理器、以及启动事件处理循环。例如,创建一个生产者线程发布消息,多个消费者线程并行处理,观察其性能提升。 6. **工具支持** 在...

    disruptor concurency pattern in c++.zip

    Disruptor模式的核心思想是消除线程间的共享数据,通过一个环形缓冲区(Ring Buffer)来传递消息,从而避免了锁和条件变量带来的性能开销。在传统的并发编程中,线程间通信通常涉及到内存同步,这可能导致阻塞和上...

    disruptor-3.2.1源码带jar包20140321

    此外,你还可以通过创建一个简单的示例来实践Disruptor的使用。首先,创建生产者和消费者,然后配置Disruptor实例,设置事件处理器链。运行示例,观察Disruptor如何在多线程环境中高效地处理事件。这不仅加深了你对...

    Disruptor学习(1)

    Disruptor-examples这个压缩包文件很可能是Disruptor的示例代码,包括了各种应用场景的实现,如简单的生产者消费者模型、多级处理链等,通过这些示例,我们可以更直观地理解Disruptor如何在实际中应用。 总的来说,...

    disruptor高性能Java线程间通讯库

    Disruptor使用了发布/订阅(Publish/Subscribe)模式,其中生产者发布事件,消费者订阅事件。此外,通过观察者模式,事件处理器可以监听和响应特定事件。 7. **代码示例与实践**: 在实际使用Disruptor时,开发者...

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

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

Global site tag (gtag.js) - Google Analytics