位置信息是否ok的标识
在生成者中是通过RingBuffer的pulish方法来修改的
调用顺序是这样的:
public void publish(long sequence)
{
sequencer.publish(sequence);
}
public void publish(final long sequence)
{
setAvailable(sequence);
waitStrategy.signalAllWhenBlocking();
}
private void setAvailable(final long sequence)
{
setAvailableBufferValue(calculateIndex(sequence), calculateAvailabilityFlag(sequence));
}
private void setAvailableBufferValue(int index, int flag)
{
long bufferAddress = (index * SCALE) + BASE;
UNSAFE.putOrderedInt(availableBuffer, bufferAddress, flag);
}
private int calculateIndex(final long sequence)
{
return ((int) sequence) & indexMask;
}
calculateIndex是获取数组的第几个位置,indexMask = bufferSize - 1;indexMask的2进制表示就是数组的长度位数全部为1.
((int) sequence) & indexMask其实就是去掉了不是数组长度的干扰.
private int calculateAvailabilityFlag(final long sequence)
{
return (int) (sequence >>> indexShift);
}
calculateAvailabilityFlag是获取当前是圈了.
因为indexShift = Util.log2(bufferSize);
这里的bufferSize和RingBuffer的bufferSize是一样的
>>> indexShift和log2操作是对应的.sequence右移indexShift位,其实即时除以了数组的大小,意思就是第几圈了.
在消费者中
getHighestPublishedSequence会调用isAvailable方法
public boolean isAvailable(long sequence)
{
int index = calculateIndex(sequence);
int flag = calculateAvailabilityFlag(sequence);
long bufferAddress = (index * SCALE) + BASE;
return UNSAFE.getIntVolatile(availableBuffer, bufferAddress) == flag;
}
可以看到isAvailable方法和生成者的逻辑是一样的.这样就能正常验证了
上面说的多个生产者的情况,可以看到用了个和RingBuffer一样大小的数组来存储标志.
如果是单个生产者的话是可以用一个变量来存就可以了的.
分享到:
相关推荐
LMAX Disruptor是一款高性能的消息处理框架,由LMAX公司开发并开源,它在金融交易领域有着广泛的应用。Disruptor的设计目标是解决多线程环境下的数据共享问题,通过优化并发性能,实现极低的延迟和高吞吐量。在Java...
Disruptor是一款高性能的Java并发框架,由LMAX公司开发并开源。它的设计目标是解决多线程环境下的数据同步问题,特别是在高并发场景下,能够显著提高系统的处理能力。Disruptor的核心设计理念是利用环形缓冲区(Ring...
disruptor-3.4.4.jar 官方github下载 亲测可用,大家赶紧下载吧 后续再补充其他常用jar(但不好下载的)
### disruptor 代码分析 #### 重要知识点概览 Disruptor框架是LMAX交易所开源的一个高性能、低延迟的消息队列实现,它采用无锁化编程技术,利用环形缓冲区(Ring Buffer)来实现高效的多生产者多消费者模型。本文...
Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip Netty整合并发编程框架Disruptor实战百万长链接服务构建源码.zip
### Disruptor并发框架知识点详解 #### 一、Disruptor简介及原理 **Disruptor** 是一款高性能、低延迟的并发框架,它通过无锁设计实现了高效的队列操作,从而大大提升了多线程环境下的性能表现。该框架于2011年...
《Disruptor应用实例》 Disruptor是高性能并发编程领域的一个重要工具...在《DisruptorStudy》这个压缩包文件中,包含了对Disruptor的详细学习资料,包括源码分析和实践案例,帮助你更全面地掌握这一强大的并发工具。
《Disruptor技术详解——基于DisruptorDemo.zip实例解析》 Disruptor,由LMAX公司开发并开源,是一款高性能、低延迟的并发工具,主要用于优化多线程间的通信。它采用一种环形缓冲区(Ring Buffer)的设计,极大地...
4. **无锁数据结构**:Disruptor使用无锁算法(如CAS)和基于内存位置的事件传递,减少了锁的使用,降低了线程同步的开销,提高了并发性能。 5. **序列化与事件转换**:启动器可能还包含对事件序列化和反序列化的...
SpringBoot整合Disruptor并发编程框架是针对高并发场景下性能优化的一种技术实践。Disruptor是由LMAX公司开发的一款高性能、低延迟的并发工具,它通过消除线程间的锁竞争,大大提升了多线程环境下的处理速度。...
Disruptor 通过事件来传递信息,每个事件都对应于处理链路中的一个步骤。 `TicketEventType.java` 可能定义了 `TicketEvent` 的各种类型,如 BUY_REQUEST, SELL_REQUEST, CANCEL_REQUEST 等,这样可以方便地识别和...
Disruptor3.x Disruptor使用方式 EventHandler[] eventHandlers=new DisruptorEventHandler[]{new DisruptorEventHandler()}; DisruptorPublisher dp=new DisruptorPublisher(1024, eventHandlers); dp.start(); ...
Disruptor是一款高性能的并发工具库,由LMAX公司开发并开源,主要应用于高频率交易系统。它通过优化线程间通信的方式,极大地提升了多线程环境下的数据处理速度。Disruptor的设计理念是避免传统的锁机制,转而采用一...
《Disruptor原始码解析-源码解析》 Disruptor是英国LMAX公司开发的一款高性能、低延迟的并发框架,它在处理高并发场景时展现出卓越的性能,被誉为金融交易领域的“神器”。本篇文章将深入探讨Disruptor的设计原理,...
学习Disruptor的源码"study-disruptor"可以帮助我们深入理解其内部机制,例如如何实现无锁操作,如何优化内存访问,以及如何通过事件处理器链来并行处理事件。通过对这些概念和技术的理解,我们可以更好地利用...
Error: java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor.<init>(Lcom/lmax/disruptor/EventFactory;ILjava/util/concurrent/ThreadFactory;Lcom/lmax/disruptor/dsl/ProducerType;Lcom/lmax/...
简单讲解disruptor并附上demo
赠送Maven依赖信息文件:disruptor-3.3.0.pom; 包含翻译后的API文档:disruptor-3.3.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.lmax:disruptor:3.3.0; 标签:disruptor、lmax、jar包、java、中文文档...