disruptor踩坑:当环空间全部用过后,有可能会出现脏数据

Disruptor作为一个高效的环状队列,其预创建的对象可能导致数据残留问题。当环空间用尽,若不同类型的事件交替使用同一对象,可能会出现脏数据。例如,假设环中有10个槽位,先填充10个A类型数据,接着填充B类型数据,由于未清空A的数据,可能导致B事件同时携带了A和B的值,造成数据错误。了解这一潜在问题有助于避免类似错误。
摘要由CSDN通过智能技术生成

 

 

前情提要:disruptor是一个环状队列,并且环内的对象在启动的时候就已经进行了创建,这也是它快的原因之一

以下是短暂的代码时间:

public class MyEvent {
  
    private Tag tag;

    private ClassA a;

    private ClassB b;

}

 

下面的init写法就是问题所在了,我的环内有两个对象,由于我post的数据有两种:tag为a是对象a有值,tag为b时,对象b有值。(两个对象不时存在)

按照一般的理解,每次传进来的对象只有一种,应该不会有问题的。但是!!!由于disruptor的event对象是预先创建的,就是说你每一次使用就都是向环内的对象赋值,然后并没有清空对应数据。假设我的环只有10个格子,我先写了十次A。第十一次输入一个B就出现问题了,这是会导致的结果是event 里的tag为b,但getA() 和 getB() 都不为空。

例子情况比较极端,知道一下是这个意思就好了。


public class DisruptorHandler {

    private int bufferSize = 1024;

    private AtomicLong keys = new AtomicLong(0);

    p
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值