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


    图解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.  
    13. public E take() throws InterruptedException
    14. final ReentrantLock lock = this.lock; 
    15. // 在这里,获取不到锁的线程只有阻塞了。 
    16. lock.lockInterruptibly(); 
    17. try
    18. while (count == 0
    19. notEmpty.await(); 
    20. return dequeue(); 
    21. } finally
    22. lock.unlock(); 

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

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

    RingBuffer

    RingBuffer就是下面这个东西:

    RingBuffer
    RingBuffer

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

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

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

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

    获取第四个元素
    获取第四个元素

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

    取第12个位置的元素
    取第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
  • 相关阅读:
    vue typescript 父子组件间值的传递
    flex 布局列表自动换行
    css文字两端对齐
    webstorm windows 常用快捷键
    vue elmentUi el-scrollbar 美化滚动条样式
    简述在Vue脚手架中,组件以及父子组件(非父子组件)之间的传值
    简述Vue的实例属性、实例方法
    Js基本类型中常用的方法总结
    简述Vue中的过滤器
    简述Vue中的计算属性
  • 原文地址:https://www.cnblogs.com/junhong1995/p/10146398.html
Copyright © 2020-2023  润新知