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

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

毫无疑问,ABQ又败下阵来。稍微分析一下原因就可以知道为什么会是这个样子的,我们在ABQ的源码中可以看到:
- public void put(E e) throws InterruptedException {
- checkNotNull(e);
- final ReentrantLock lock = this.lock;
- // 在这里,获取不到锁的线程只有阻塞了。
- lock.lockInterruptibly();
- try {
- while (count == items.length)
- notFull.await();
- enqueue(e);
- } finally {
- lock.unlock();
- }
- }
- public E take() throws InterruptedException {
- final ReentrantLock lock = this.lock;
- // 在这里,获取不到锁的线程只有阻塞了。
- lock.lockInterruptibly();
- try {
- while (count == 0)
- notEmpty.await();
- return dequeue();
- } finally {
- lock.unlock();
- }
- }
ABQ内部,不论是put()还是take()都使用了锁对资源进行同步,获取不到锁的线程就只能阻塞了。但是相比于ABQ,Disruptor号称是不使用锁进行资源同步的。孰优孰劣,在此Disruptor先胜一局。这里先留个悬念,既然Disruptor不使用锁,那么他是怎么做到的?
在对Disruptor进行深入的了解之前,我们先来看下Disruptor的核心数据结构--RingBuffer。
RingBuffer
RingBuffer就是下面这个东西:

先来简单的介绍一下Ringbuffer这个名字,这个名字有两个特点:
- Ring:环形的。
- Buffer:缓存。
这一节先介绍第一个特点,环形的。(关于缓存,简单的说,Disruptor使用了一个内存预加载的机制,在构造Ringbuffer的时候已经初始化好了数据。每次存数据,其实是对数据的更新。)
RingBuffer本质上是一个数组,因此对数据的索引十分的方便。

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

想取第十二个位置的元素也非常的简单,初中数学告诉我们,只需要在:
12 % 10 = 2 这个位置,就可以取到这个元素。
以上就是Disruptor最核心的数据结构了。这个框架中的其他一切组件:生产者、消费者、序号生成器等等之类的组件,都是为了服务这个RingBuffer而诞生的。
总结
今天这篇就是简单的介绍一下disruptor这个框架。大家只需要先有个印象,知道有这么一个东西就行了。后续我会慢慢的将这些东西补充完全。
参考资料
图解Disruptor框架(一):初识Ringbuffer的更多相关文章
- 图解Disruptor框架(二):核心概念
图解Disruptor框架(二):核心概念 概述 上一个章节简单的介绍了了下Disruptor,这节就是要好好的理清楚Disruptor中的核心的概念.并且会给出个HelloWorld的小例子. 在正 ...
- Disruptor框架中生产者、消费者的各种复杂依赖场景下的使用总结
版权声明:原创作品,谢绝转载!否则将追究法律责任. Disruptor是一个优秀的并发框架,可以实现单个或多个生产者生产消息,单个或多个消费者消息,且消费者之间可以存在消费消息的依赖关系.网上其他博客 ...
- VUE框架的初识
VUE框架的初识 初步了解Vue.js框架(渐进式前端框架) Vue.js是一种轻量级的前端MVVM框架.同时吸收了React(组件化)和Angular(灵活指令页面操作)的优点.是一套构建用户界面的 ...
- Disruptor框架EventProcessor和Workpool的使用
场景使用: 在HelloWorld的实例中,我们创建Disruptor实例,然后调用getRingBuffer方法去获取RingBuffer,其实在很多时候,我们可以直接使用RingBuffer,以及 ...
- python的Web框架:初识Django
web应用程序 本质 socket服务端 浏览器本质是一个socket客户端 1. 服务器程序 socket请求 接受HTTP请求,发送HTTP响应. 比较底层,繁琐,有专用的服务器软件,如:Apac ...
- Flask(1)- 主流web框架、初识flask
一.Python 现阶段三大主流Web框架 Django.Tornado.Flask 对比 Django 主要特点是大而全,集成了很多组件(例如Models.Admin.Form等等), 不管你用得到 ...
- web框架--tornado框架之初识
在python中常见的web框架构建模式有以下两种: *MVC框架: * 数据库相关操作的Models 视图文件的Views 业务逻辑的Controllers MTV框架: 数据库相关操作的Model ...
- Dva框架从初识到上手
引言 最近工作需要用dva框架,同事帮我培训了一下,有一点点认识,在此总结. 当然,以后对dva可能会了解更透彻,文章会不断更新的. 初识 开始看架构代码,没有看文档的时候,不知道里面的几个关键字 ...
- web框架之初识Django
目录 一.web框架 1.1什么是web框架 1.2自制的简易web框架 1.3三大主流web框架简介 Django Flask Tornado 1.4动态网页与静态网页 二.初识Django框架 2 ...
随机推荐
- Codeforces 185B(数学结论)
要点 有不等式\(x^ay^bz^c=a^ab^bc^c(\frac{x}{a})^a(\frac{y}{b})^b(\frac{z}{c})^c<=a^ab^bc^c(\frac{x+y+z} ...
- [HNOI2010] 弾飞绵羊
题目链接: 传送门 题目分析: 题外话: 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出: 根号算法牛逼!!! 显然,这是一道LCT裸题,然而在下并不会LCT于是采用了分块瞎搞 对于每个点 ...
- Canada Cup 2016 D. Contest Balloons 好题。优先队列 + 简单贪心
http://codeforces.com/contest/725/problem/D 这题一看就是贪心的了,w - t最小的那个,肯定是优先打死. 但是一直都不会写,为什么呢,因为这个太像二分答案了 ...
- Jexus~docker与它产生了暖味
前段时间写了很多docker for .net core的文章,用来快速部署微服务相当给力,而尝到了香头的我们希望把.net frameworks的程序也使用docker来部署一下,那么接下来我就结果 ...
- 事务的隔离级别和mysql事务隔离级别修改
A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...
- Sql server 查询指定时间区间工作日数、休息日数等日期操作
1.查询指定时间区间的工作日 这个主要难点是法定节假日,国家的法定节假日每年都不一样,还涉及到调休,所以我们设计一个假日表.主要字段有年份,类型(是否调休),假期日期.如下: CREATE TABLE ...
- AngularJS所有版本下载地址
AngularJS官网本身采用AngularJS库构建,页面中的AngularJS库通过Google的CDN(内容分发网络)引入,所以国内访问会有问题. 大家可以从下面地址获取AngularJS所以版 ...
- 【js类库AngularJs】解决angular+springmvc的post提交问题
[js类库AngularJs]解决angular+springmvc的post提交问题 AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前 ...
- Jenkins上svn更新策略说明
- 【TensorFlow入门完全指南】神经网络篇·循环神经网络(RNN)
第一步仍然是导入库和数据集. ''' To classify images using a reccurent neural network, we consider every image row ...