RingBuffer

在阅读sofaJraft的代码时候,有一个Disruptor 框架,可以非常高性能的处理produce-consumer 消息据说,disruptor 使用的是 ringbuffer , 相比较 jdk 的 blocking queue,主要做的优化是 锁的方面;

他们在数据结构方面也没有特别大的差异,blocking queue 和 ringbuufer 用的都是 环形数组; 环形数组,在设计上有几个要点:

  • header 记录 read 的位置
  • tail 记录写的位置
  • capacity = maxSize -1, 这样可以区分 full 和empty ;
    环形数组,使用双指针,可以非常方便的读取和添加 元素; 如果不适用环形数组, 我们通常要么损失空间,要么损失时间。

比如只用一个数组:
1, 我们可以读取 header,然后header--; 那么 head -》 tail 的空间无法利用,浪费空间;
2, 我们可以读取header之后,把元素整体移动向前,给 tail 留出空间,那么移动就要消耗时间;

所以环形数组是空间和时间很优秀的 queue;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容