图解Disruptor框架(一):初识Ringbuffer

概述

1、 什么是Disruptor?为什么是Disruptor?

Disruptor是一个性能十分强悍的无锁高并发框架。在JUC并发包中,号称是性能最好的ArrayBlockingQueue(简称:ABQ),在Disruptor的面前,也只能低下骄傲的头颅了。现在我们来看一下官方给出的测试数据。


吞吐量

上图是官方给出的在不同的模式下,使用ABQ以及Disruptor的吞吐量对比图。可见,在相同的模式之下,ABQ的性能跟Disruptor的性能不是一个数量级的。

接下来,看看耗时怎么样:


耗时对比

毫无疑问,ABQ又败下阵来。稍微分析一下原因就可以知道为什么会是这个样子的,我们在ABQ的源码中可以看到:

  1. public void put(E e) throws InterruptedException { 

  2. checkNotNull(e); 

  3. final ReentrantLock lock = this.lock; 

  4. // 在这里,获取不到锁的线程只有阻塞了。 

  5. lock.lockInterruptibly(); 

  6. try { 

  7. while (count == items.length) 

  8. notFull.await(); 

  9. enqueue(e); 

  10. } finally { 

  11. lock.unlock(); 






  12. public E take() throws InterruptedException { 

  13. final ReentrantLock lock = this.lock; 

  14. // 在这里,获取不到锁的线程只有阻塞了。 

  15. lock.lockInterruptibly(); 

  16. try { 

  17. while (count == 0) 

  18. notEmpty.await(); 

  19. return dequeue(); 

  20. } finally { 

  21. lock.unlock(); 





ABQ内部,不论是put()还是take()都使用了锁对资源进行同步,获取不到锁的线程就只能阻塞了。但是相比于ABQ,Disruptor号称是不使用锁进行资源同步的。孰优孰劣,在此Disruptor先胜一局。这里先留个悬念,既然Disruptor不使用锁,那么他是怎么做到的?

在对Disruptor进行深入的了解之前,我们先来看下Disruptor的核心数据结构--RingBuffer

RingBuffer

RingBuffer就是下面这个东西:


RingBuffer

先来简单的介绍一下Ringbuffer这个名字,这个名字有两个特点:

  • Ring:环形的。
  • Buffer:缓存。

这一节先介绍第一个特点,环形的。(关于缓存,简单的说,Disruptor使用了一个内存预加载的机制,在构造Ringbuffer的时候已经初始化好了数据。每次存数据,其实是对数据的更新。)

RingBuffer本质上是一个数组,因此对数据的索引十分的方便。


获取第四个元素

随着数据的增多,序号的增大,这个环可能会变成以下的这个样子:


取第12个位置的元素

想取第十二个位置的元素也非常的简单,初中数学告诉我们,只需要在:

12 % 10 = 2 这个位置,就可以取到这个元素。

以上就是Disruptor最核心的数据结构了。这个框架中的其他一切组件:生产者、消费者、序号生成器等等之类的组件,都是为了服务这个RingBuffer而诞生的。

总结

今天这篇就是简单的介绍一下disruptor这个框架。大家只需要先有个印象,知道有这么一个东西就行了。后续我会慢慢的将这些东西补充完全。

参考资料

  1. 官方的设计说明以及测试 http://101.96.10.64/lmax-exchange.github.io/disruptor/files/Disruptor-1.0.pdf
  2. Ringbuffer设计的简要介绍 http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html

图解Disruptor框架(一):初识Ringbuffer的更多相关文章

  1. 图解Disruptor框架(二):核心概念

    图解Disruptor框架(二):核心概念 概述 上一个章节简单的介绍了了下Disruptor,这节就是要好好的理清楚Disruptor中的核心的概念.并且会给出个HelloWorld的小例子. 在正 ...

  2. Disruptor框架中生产者、消费者的各种复杂依赖场景下的使用总结

    版权声明:原创作品,谢绝转载!否则将追究法律责任. Disruptor是一个优秀的并发框架,可以实现单个或多个生产者生产消息,单个或多个消费者消息,且消费者之间可以存在消费消息的依赖关系.网上其他博客 ...

  3. VUE框架的初识

    VUE框架的初识 初步了解Vue.js框架(渐进式前端框架) Vue.js是一种轻量级的前端MVVM框架.同时吸收了React(组件化)和Angular(灵活指令页面操作)的优点.是一套构建用户界面的 ...

  4. Disruptor框架EventProcessor和Workpool的使用

    场景使用: 在HelloWorld的实例中,我们创建Disruptor实例,然后调用getRingBuffer方法去获取RingBuffer,其实在很多时候,我们可以直接使用RingBuffer,以及 ...

  5. python的Web框架:初识Django

    web应用程序 本质 socket服务端 浏览器本质是一个socket客户端 1. 服务器程序 socket请求 接受HTTP请求,发送HTTP响应. 比较底层,繁琐,有专用的服务器软件,如:Apac ...

  6. Flask(1)- 主流web框架、初识flask

    一.Python 现阶段三大主流Web框架 Django.Tornado.Flask 对比 Django 主要特点是大而全,集成了很多组件(例如Models.Admin.Form等等), 不管你用得到 ...

  7. web框架--tornado框架之初识

    在python中常见的web框架构建模式有以下两种: *MVC框架: * 数据库相关操作的Models 视图文件的Views 业务逻辑的Controllers MTV框架: 数据库相关操作的Model ...

  8. Dva框架从初识到上手

    引言 最近工作需要用dva框架,同事帮我培训了一下,有一点点认识,在此总结. 当然,以后对dva可能会了解更透彻,文章会不断更新的.   初识 开始看架构代码,没有看文档的时候,不知道里面的几个关键字 ...

  9. web框架之初识Django

    目录 一.web框架 1.1什么是web框架 1.2自制的简易web框架 1.3三大主流web框架简介 Django Flask Tornado 1.4动态网页与静态网页 二.初识Django框架 2 ...

随机推荐

  1. jQuery实现全选反选功能

    废话不说,直接上代码! <html> <head> <meta http-equiv="Content-Type" content="tex ...

  2. 泛型设计<T, PK extends Serializable>

    泛型类和泛型方法的使用 http://www.jb51.net/article/67445.htm http://www.cnblogs.com/iyangyuan/archive/2013/04/0 ...

  3. redis最佳实践

    总结: String类型的value(string/list/set/hash)使用StringRedisTemplate 其他类型的value(string/list/set/hash/object ...

  4. ML.NET 示例:目录

    ML.NET 示例中文版:https://github.com/feiyun0112/machinelearning-samples.zh-cn 英文原版请访问:https://github.com/ ...

  5. 【转】"超时时间已到。在操作完成之前超时时间已过或服务器未响应"的解决方法

    方法有以下三种: 1.原因应该在数据访问有问题,可以把连接时间设置长些,在数据库连接字符串,加上Connect Timeout=18000,单位毫秒 2,在web.config中加上以下语句: < ...

  6. pytorch 0.3 win7 安装

    pytorch 0.3 win7 安装 参考这个文章:https://github.com/peterjc123/pytorch-scripts 首先安装 conda 这个链接下载: python 3 ...

  7. Kendo MVVM 数据绑定(五) Events

    Kendo MVVM 数据绑定(五) Events 本篇和 Kendo MVVM 数据绑定(三) Click 类似,为事件绑定的一般形式.Events 绑定支持将 ViewModel 的方法绑定到 D ...

  8. C#字段声明部分如何调用该类中的方法进行初始化?

    问题描述: 有时,功能需求,需要在初始化字段时,需要视不同情况赋予不同字段值. 解决办法: 将方法设为static即可. e.g. public string str = SetStr(); publ ...

  9. ABAP vs Java, 蛙泳 vs 自由泳

    去年7月定下的一年之内学会自由泳的目标终于实现了,特来还愿. ABAP和Java, 蛙泳和自由泳.前面的组合是Jerry用来挣钱养家的技术,后者是Jerry花了大量业余时间和金钱苦练的技能.或许有的朋 ...

  10. cesium模型加载-加载fbx格式模型

    整体思路: fbx格式→dae格式→gltf格式→cesium加载gltf格式模型 具体方法: 1. fbx格式→dae格式 工具:3dsMax, 3dsMax插件:OpenCOLLADA, 下载地址 ...