`
- 浏览:
2619160 次
- 性别:
- 来自:
广州
-
Disruptor 源码分析(1) Disruptor的原理
Disruptor最大的特点是无锁实现队列.(当然默认使用的BlockingWaitStrategy还是用到了lock.lock();publish的时候signalAll().但是你可以选择不用这种策略的)
Disruptor说的是生产者和消费者的故事.
有一个数组.生产者往里面扔芝麻.消费者从里面捡芝麻.
但是扔芝麻和捡芝麻也要考虑速度的问题.
1 消费者捡的比扔的快 那么消费者要停下来.生产者扔了新的芝麻,然后消费者继续.
2 数组的长度是有限的,生产者到末尾的时候会再从数组的开始位置继续.这个时候可能会追上消费者,消费者还没从那个地方捡走芝麻,这个时候生产者要等待消费者捡走芝麻,然后继续.
这个就是基本的逻辑.为了实现这个逻辑.
消费者要知道生产者扔到哪里了,这样才不会出现超过生产者.
生产者也必须要知道消费者捡到哪里了,这样才不会出现从后面超过消费者.
在Disruptor中位置是用Sequence来表示的.
数组呢,就是用RingBuffer中的Object[] entries来表示的.
生产者会有多个,这个时候会去抢数组的同一个位置.在一般的java程序中,是通过加锁来实现.但是Disruptor是通过cas来实现的.多个会去竞争,由于cas是原子的,不会存在两个同时抢到.抢不到怎么办,那就抢下一个位置.
生产者抢位置是通过next()来实现的,但是抢到位置还不能通知消费者,因为这个时候还没把芝麻扔进去,等到芝麻扔进去之后,执行publish()操作,这个时候就设置个标志表示ok了,所以消费者每次检查的时候会核对这个标志位.
消费者也有多个,所以Disruptor的生产者要检查消费者的Sequence数组,取最小的(就是最慢的消费者)
生产者和消费者都要不断的去检查对方的位置,防止超过对方.检查的策略就有多种了.
默认的策略是不主动检查,而是等待对方的通知.也有种策略是不停的去检查,这样就不用通知了,但是这个是很吃cpu的,所以也出来一种变种,就是每隔一个很短的时间去检查一次.当然有很多种的策略,就不细说了.
恩 大概就是这样了.
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
1. **Disruptor的核心概念** - **Ring Buffer**:Disruptor的核心数据结构是一个环形缓冲区,它避免了锁和内存屏障带来的性能开销,通过固定大小的缓存块进行数据交换。 - **Sequencer**:负责为生产者和消费者...
1. **Disruptor的基本原理** Disruptor的核心是一个固定大小的环形缓冲区,每个槽位代表一个消息。生产者将消息放入缓冲区,消费者则从缓冲区取出消息。通过使用LongAdder等无锁算法,Disruptor避免了传统锁机制...
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...
学习Disruptor的源码"study-disruptor"可以帮助我们深入理解其内部机制,例如如何实现无锁操作,如何优化内存访问,以及如何通过事件处理器链来并行处理事件。通过对这些概念和技术的理解,我们可以更好地利用...
深入Disruptor源码分析 #### (1) 核心概念 - **Ring Buffer**:环形队列是Disruptor的基础数据结构,它使用固定大小的数组,避免了动态扩容带来的开销。 - **Sequence**:序列号,用于跟踪Ring Buffer中每个槽位的...
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...
项目涵盖了并发编程的核心概念、无锁并行计算框架的使用、高级特性、底层源码分析以及与Netty的整合实战。通过本项目,开发者可以深入理解并发编程的原理,掌握Disruptor框架的使用,并能够构建高性能的并发应用。 ...
七、源码分析 深入理解Disruptor的源码,可以帮助开发者更好地掌握其实现原理,从而在实际项目中更有效地应用。例如,了解如何实现无锁算法、Sequence的管理以及Ring Buffer的细节,都有助于提升代码的并发性能。 ...
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...
Storm是一个开源的分布式实时计算系统,它是由Nathan Marz等人在Twitter工作期间开发的。...通过深入分析这些知识点,可以加深对Storm源码的理解,并且帮助编程人员提高解决实时大数据分析问题的能力。
- **阅读源码**:通过阅读和理解测试源码,可以深入掌握Log4j2的工作原理和性能调优技巧。 - **动手实践**:自己编写测试用例,模拟不同的日志场景,对比不同配置下的性能差异。 通过这份"Log4j2效率测试源码",...
3. 阅读和分析Disruptor框架的源码,理解其序列、事件处理器链和屏障(Barrier)等核心概念。 4. 实践编写简单的无锁队列,通过实际操作加深理解。 5. 分析和对比无锁队列与其他并发数据结构(如阻塞队列、同步队列...
在`DisruptorSrcTest`中,你可以看到Disruptor的源码分析和测试用例,这对于理解其工作原理和优化并发性能非常有帮助。 其次,`Concurrent`可能指的是`java.util.concurrent`包下的一些并发工具类,如`...
从提供的文件内容来看,这段文档是对Apache Storm分布式实时计算系统的源码分析笔记。尽管文档内容有OCR技术...如果要完整掌握Storm的源码结构和运行原理,建议阅读完整的源码分析文档或官方文档以获得更全面的理解。
本文主要探讨Log4j2异步写日志的效率,通过源码分析和测试来展示其优势。首先,我们要理解Log4j2中的异步日志工作原理。默认情况下,Log4j2使用同步模式记录日志,即每个日志事件都会阻塞直到写入完成。然而,通过...
1. **信息隐藏**:信息隐藏是将秘密信息嵌入到载体(如图像、音频或视频)中,使得非授权者难以察觉其存在。目的是为了保护敏感信息,防止非法获取或篡改。LSB信息隐藏是信息隐藏的一种常见方法。 2. **LSB原理**:...
源码包的获取,对于开发者深入理解其工作原理、定制化需求以及性能优化至关重要。本文将围绕Log4j 2.11.0的源码展开,详细剖析其核心组件、设计理念和关键特性。 1. **日志系统概述** 日志系统是软件开发中的重要...
理解这些基础概念对于深入源码分析至关重要。`synchronized`用于线程同步,`volatile`保证了内存可见性,而`java.util.concurrent`包则包含了许多高效并发工具,如`Semaphore`、`CountDownLatch`和`CyclicBarrier`等...