Java环形缓冲区的简单介绍

使用场景

只有当存储空间的分配和释放非常频繁并且对性能产生了明显的影响,才考虑环形缓冲区的使用。否则可以使用队列缓冲区。

环形缓冲区及阻塞队列缓冲区对比

1.对列缓冲区有一个写入端和一个读出端。当队列为空时,无法读出,当队列满了时,无法写入。队列缓冲区在push的时候,可能会分配存储空间用于存储新元素;在pop时,可能会释放废弃元素的存储空间。

2.环形缓冲区也有一个写入端和一个读出端。也有‘空’和‘满’两个状态。环形缓冲区所有的push和pop操作都是在一个固定的存储空间内进行,不会对元素所用存储空间进行分配和释放

实现

基于数组

优点:数组在物理存储上是一维的连续线性结构,它可以在初始化时,把存储空间一次性分配好。
缺点:使用数组来模拟环,必须在逻辑上把数组的头和尾相连。在顺序遍历数组时,对尾部元素(最后一个元素)要作一下特殊处理。访问尾部元素的下一个元素时,要重新回到头部元素(第0个元素)。

基于链表

优点:省去了头尾相连的特殊处理。
缺点:初始化比较繁琐,而且在有些场合不太方便使用

读—写

环形缓冲区有两个索引,分别对应写入端和读取端。

写入的时候,要确保环未满,然后把数据复制到写入端所对应的元素,然后将写入端指向下一个元素;读的时候,要确保环非空,然后返回读取端对应的元素,然后将读取端指向下一个元素。

状态的判断

环形缓冲区也有两个状态,即’空’和’满’,但是环形缓冲区是环形的,在’空’或’满’时写入端和读取端指向同一个位置,这样就造成了无法区分’空’和’满’。

一般可以采取单独维护一个变量来记录当前已经保存的元素个数(大于等于0),这样当写入端和读取端指向同一个位置时就可以区分当前是哪个状态了

存储的元素注意事项

环形缓冲区本身就是为了降低队列缓冲区存储空间分配的开销,因此要
尽量存储值类型的数据,而不要存储指针(引用)类型的数据。因为指针类型的数据又会引起存储空间(比如堆内存)的分配和释放,使得环形缓冲区的效果打折扣。

Disruptor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值