首先这个类的uml结构在disruptor中是这样的,里面只有部分的属性对象和函数内容,具体有什么作用,用到了再说,用不到我也不会。。。

1、那么这个对象有什么用呢?

注意我们这个类中有哪些属性:

我们在给disruptor添加消费事件对象的时候,disruptor会创建这个对象,在disruptor对象中也是使用ringbuffer进行创建的

默认都是new sequence[0]传递一个类对象

waitStrategy   我们等待获取序列的策略

cursorSequence  ringbuffer中的当前的序号,这个只是作为一个指示器,并不使用

dependentSequence  这个应该是外部依赖的序号,是实际参与判断的当前序号,就是标识当前生产者生产出来到的数据位置(当构造的时候dependentSequence = cursorSequence;)

    如果是使用了多个消费队列相互依赖,比如队列2依赖队列1完成之后才可以进行,那么就需要根据这个来进行判断,(availableSequence = dependentSequence.get()) < sequence

在创建消费者进程的时候每一个消费者进程对象都会创建一个barrier对象,每一个消费者进程类都有一个独立的barrier对象

在执行消费者进程的时候:在获取下一个游标的时候,用waitfor方法获取,根据不同的等待策略获取下一个值

2、这个对象在什么情况下我们会用到?

注意了哈,看看uml图,我们看到里面有一个waitFor函数,我们把这个函数拿出来

    @Override
public long waitFor(final long sequence)
throws AlertException, InterruptedException, TimeoutException
{
checkAlert(); long availableSequence = waitStrategy.waitFor(sequence, cursorSequence, dependentSequence, this); if (availableSequence < sequence)
{
return availableSequence;
} return sequencer.getHighestPublishedSequence(sequence, availableSequence);
}

看到没,看到了你也看不懂的!!!

这个函数是用来获取下一个序列值的,如果你问我根据什么来获取???

好吧,这个就是我们在创建disruptor对象的时候设置的等待策略有关了,也就是WaitStrategy这个对象

那么这个问题其实前面已经回答了:那就是获取ringbuffer中下一个进行操作的对象的序列位置,这个时候会用到,注意哦,是消费者获取对象的序列的时候

3、我们如何使用这个对象,或者disruptor如何使用这个对象?

disruptor在使用这个对象的时候,是在事件的run方法中,获取下一个sequence值大小

在获取下一个sequence的时候,通过不同的等待策略获取availableSequence

如果获取成功,那么获取到的dependentSequence值应该是比当前期望的序列号sequence小

那么这里的dependentSequence怎么改变的呢?

这个是在生产者生产数据的时候标识的游标,生产到那个数据了,生产者是改变了cursorSequence这个数据

【disruptor】1、关于disruptor中的SequenceBarrier对象的更多相关文章

  1. C#开发中使用配置文件对象简化配置的本地保存

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  2. 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor

    批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4  POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...

  4. 关于Javascript中通过实例对象修改原型对象属性值的问题

    Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的 ...

  5. DOM中的事件对象

    三.事件对象事件对象event1.DOM中的事件对象(1).type:获取事件类型(2).target:事件目标(3).stopPropagation() 阻止事件冒泡(4).preventDefau ...

  6. MongoDB学习笔记~MongoDB实体中的值对象

    回到目录 注意,这里说的值对象是指在MongoDB实体类中的,并不是DDD中的值对象,不过,两者也是联系,就是它是对类的补充,自己本身没有存在的价值,而在值对象中,也是不需要有主键Id的,这与DDD也 ...

  7. List中存储同一个对象(内容不同)

    List中存储同一个对象,前面的会被后存入的对象覆盖,解决方法:每次存入新的对象

  8. 关于javascript闭包中的this对象

    我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...

  9. DOM和IE中的 事件对象

    DOM中的事件对象:(符合W3C标准)    preventDefault()        取消事件默认行为    stopImmediatePropagation() 取消事件冒泡同时阻止当前节点 ...

随机推荐

  1. ThinkPHP 二维码生成

    请求获取并展示二维码 <img src="<?php echo U('createCode?zsnumber='.$time.$kcname['id'].$stuInfo['id ...

  2. ZOJ 3216 Compositions (矩阵快速幂)

    题意:求把 n 拆成几个大于等于 k 的数的和的方案数. 析:根据题目很容易写出递推式,f[i] = f[i-1] + f[i-k],什么意思呢,f[i-1] 表示是进行加 1 操作,那么可以给 n- ...

  3. oracle学习笔记一:用户管理(2)创建删除用户

    本文主要介绍如何创建和删除用户,当然里面牵涉很多知识,慢慢道来. 1,创建用户 需求:假设你是oracle管理员,当一个同事入职,你需要分配给一个账号. 创建用户,一般需要有相应权限的用户才可以创建用 ...

  4. 论文翻译技巧--Notepad替换回车

  5. 20155205 《Java程序设计》实验四 Android程序设计

    20155205 <Java程序设计>实验四 Android程序设计 一.实验内容及步骤 (一) Android Stuidio的安装测试 参考<Java和Android开发学习指南 ...

  6. 队列<一>

    这里用的递归法,采用两种版本,一种是C语言,一种是C++:但是,用C语言没有“引用”,所以采用的是指向指针的指针:而C++具备“引用”,所以直接用&引用,简洁: 先看C++的代码: BiTre ...

  7. mybatis-generator扩展教程系列 -- 自定义generatorConfig.xml参数

    http://blog.csdn.net/shadowsick/article/details/53413235

  8. 【ORA错误大全】 ORA-19527

    在做主备切换的时候,需要将备库的联机日志文件清除(clear online redo logfile),为了加快switchover的速度,Oracle10g在将备库置于manged standby状 ...

  9. classmethod,staticmethod

    '''1 绑定方法: 在类内部定义的函数,默认就是给对象来用,而且是绑定给对象用的,称为对象的绑定方法 绑定对象的方法特殊之处: 应该由对象来调用,对象来调用,会自动将对象当作第一个参数传入 绑定到类 ...

  10. python advanced programming ( I )

    函数式编程 函数是Python内建支持的一种封装,通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基 ...