【disruptor】1、关于disruptor中的SequenceBarrier对象
首先这个类的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对象的更多相关文章
- C#开发中使用配置文件对象简化配置的本地保存
C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...
- 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor
批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11 之前写过一篇文章,使用redgate公司的SQL PROMPT工具,但是不太方便 SQLPRO ...
- 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4 POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...
- 关于Javascript中通过实例对象修改原型对象属性值的问题
Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的 ...
- DOM中的事件对象
三.事件对象事件对象event1.DOM中的事件对象(1).type:获取事件类型(2).target:事件目标(3).stopPropagation() 阻止事件冒泡(4).preventDefau ...
- MongoDB学习笔记~MongoDB实体中的值对象
回到目录 注意,这里说的值对象是指在MongoDB实体类中的,并不是DDD中的值对象,不过,两者也是联系,就是它是对类的补充,自己本身没有存在的价值,而在值对象中,也是不需要有主键Id的,这与DDD也 ...
- List中存储同一个对象(内容不同)
List中存储同一个对象,前面的会被后存入的对象覆盖,解决方法:每次存入新的对象
- 关于javascript闭包中的this对象
我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...
- DOM和IE中的 事件对象
DOM中的事件对象:(符合W3C标准) preventDefault() 取消事件默认行为 stopImmediatePropagation() 取消事件冒泡同时阻止当前节点 ...
随机推荐
- springboot xml声明式事务管理方案
在开发过程中springboot提供的常见的事务解决方案是使用注解方式实现. 使用注解 在启动类上添加注解 @EnableTransactionManagement 在需要事务控制的方法添加@Tran ...
- vue 开发系列(八) 动态表单开发
概要 动态表单指的是我们的表单不是通过vue 组件一个个编写的,我们的表单是根据后端生成的vue模板,在前端通过vue构建出来的.主要的思路是,在后端生成vue的模板,前端通过ajax的方式加载后端的 ...
- GDI基础(1):绘制线条和图形
1. 绘制一个像素点:SetPixel(). 绘制直线:MoveTo(),LineTo(). 绘制多个首尾相连的线:Polyline(). 绘制矩形:FrameRect(),Rectangle(),F ...
- A-论文一些好的句子
Using our techniques, task set transformation is performed by modifying the parameters related to ea ...
- CodeForces 916B Jamie and Binary Sequence (changed after round) (贪心)
题意:给定两个数字n,m,让你把数字 n 拆成一个长度为 m 的序列a1,a2,a3...am,并且∑2^ai = n,如果有多组,要求序列中最大的数最小,然后再相同就要求除了最大数字典序最大. 析: ...
- Java利用MethodHandle实现反射时调用super的method
一:实现 1.Base类的实现 package me.silentdoer.reflecsuper; /** * @author silentdoer * @version 1.0 * @descri ...
- hadoop 组件 hdfs架构及读写流程
一 . Namenode Namenode 是整个系统的管理节点 就像一本书的目录,储存文件信息,地址,接受用户请求,等 二 . Datanode 提供真实的文件数据,存储服务 文件块(block)是 ...
- 20145232 韩文浩 《Java程序设计》第4周学习总结
教材学习内容总结 · Chapter 继承与多态 继承:避免多个类间重复定义共同行为.继承可以理解为一个对象从另一个对象获取属性的过程. 所有Java的类均是由java.lang.Object类继承而 ...
- spring-aop代理的生效原理
主要说下spring里aop的生效的原理吧,并不是讲底层的cglib和gdk动态代理. 还是老一套的分析流程,先找到了aop的标签的handler,然后看下在解析这个标签的时候,都干了些什么,其实主要 ...
- 第K大01背包
其实这个问题,真的挺好想的,但是我咋想了那么久呢~~ 很好理解,第K大01背包一定基于01背包,dp数组也很容易的想到由dp[V] ----> dp[V][K],来表示背包容量是V时候的第 ...