Disruptor无锁ringbuff实现
http://blog.163.com/zongyuan1987@126/blog/static/131623156201271021955717/?latestBlog
2. CAS: CAS的涵义不多介绍了。使用CAS时不像上锁那样需要一次上下文切换,但是也需要处理器锁住它的指令流水线来保证原子性,并且还要加上Memory Barrier来保证其结果可见。
4. Cache Line:cache line解释起来其实很简单,就是CPU在做缓存的时候有个最小缓存单元,在同一个单元内的数据被同时被加载到缓存中,充分利用 cache line可以大大降低数据读写的延迟,错误利用cache line也会导致缓存不同替换,反复失效。
图2. RingBuffer当前的队尾位置序号为18.生产者提出申请。
图3. 生产者申请得到第19号位置,并且19号位置是独占的,可以写入生产元素。此时19号元素对消费者是不可见的。
图4,生产者成功写入19号位置后,将cursor修改为19,从而完成发布,之后消费者可以消费19号元素。
/** * <pre> * 场景描述:生产者p1生产出来的数据需要经过消费者ep1和ep2的处理,然后传递给消费者ep3 * * +-----+ * +----->| EP1 |------+ * | +-----+ | * | v * +----+ +-----+ * | P1 | | EP3 | * +----+ +-----+ * | ^ * | +-----+ | * +----->| EP2 |------+ * +-----+ * * * 基于队列的解决方案 * ============ * take put * put +====+ +-----+ +====+ take * +----->| Q1 |<---| EP1 |--->| Q3 |<------+ * | +====+ +-----+ +====+ | * | | * +----+ +====+ +-----+ +====+ +-----+ * | P1 |--->| Q2 |<---| EP2 |--->| Q4 |<---| EP3 | * +----+ +====+ +-----+ +====+ +-----+ * * 使用Disruptor的解决方案:* 以一个RingBuffer为中心,生产者p1生产事件写到ringbuffer中,消费者ep1和ep2仅需要根据队尾位置来进行判断是否有可消费事件即可,消费者ep3则需要根据消费者ep1和ep2的位置来判断是否有可消费事件。生产者需要跟踪ep3的位置,防止覆盖未消费事件。 * ========== * track to prevent wrap * +-------------------------------+ * | | * | v * +----+ +====+ +=====+ +-----+ * | P1 |--->| RB |<--------------| SB2 |<---| EP3 | * +----+ +====+ +=====+ +-----+ * claim ^ get | waitFor * | | * +=====+ +-----+ | * | SB1 |<---| EP1 |<-----+ * +=====+ +-----+ | * ^ | * | +-----+ | * +-------| EP2 |<-----+ * waitFor +-----+ */
Disruptor无锁ringbuff实现相关推荐
- 非阻塞同步算法与CAS(Compare and Swap)无锁算法
锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...
- 你应该知道的高性能无锁队列Disruptor
1.何为队列 听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见,去超市结账,你会看见大家都会一排排的站得好好的,等待结账,为什么要站得一排排的,你想象一下大家都没有素质,一窝蜂的上去结账,不 ...
- 每秒钟承载600万订单级别的无锁并行计算框架 Disruptor学习
1.来源 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列.基于Disruptor开发的系统单线程能支撑每秒600万订单,2 ...
- java 无锁框架_高性能无锁并发框架 Disruptor,太强了!
Java技术栈 www.javastack.cn 关注优质文章 Disruptor是一个开源框架,研发的初衷是为了解决高并发下队列锁的问题,最早由LMAX提出并使用,能够在无锁的情况下实现队列的并发操 ...
- 【java并发编程】无锁并发框架disruptor
一.简介 Disruptor是一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列.基于Disruptor开发的系统单线程能支撑每秒600万订单. 使用场景:对延时要求很高的场景 ...
- 无锁队列Disruptor
1.何为队列 听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见,去超市结账,你会看见大家都会一排排的站得好好的,等待结账,为什么要站得一排排的,你想象一下大家都没有素质,一窝蜂的上去结账,不 ...
- java 无锁缓存_如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- 线程安全的无锁RingBuffer的实现
这里的线程安全,是指一个读线程和一个写线程,读写两个线程是安全的,而不是说多个读线程和多个写线程是安全的.. 在程序设计中,我们有时会遇到这样的情况,一个线程将数据写到一个buffer中,另外一个线程 ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本) 转载
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
最新文章
- 【Linux】 Linux简单操作之网络通信和网络访问
- 你知道怎么使用OpenCV检测篮球运动员吗?
- #define定义宏函数 的正确使用
- Windows 2012 下Redmine安装和环境搭建
- linux管理Windows文件,Linux与Windows互传文件,用户组管理和用户管理
- python文件のpandas操作
- Cassandra操作入门
- Windows多屏开发小记
- Spring+Netty4实现的简单通信框架
- react项目在配置webpack的时候问题
- MyCat分片规则之固定hash分片
- 计算机维修英语情景对话大全,实用英语短对话:修电脑
- 一场视频号裂变活动获客3W+,头部品牌裂变案例拆解
- Atcoder ARC093F : Dark Horse
- Web认证方法探视(1)
- 利用Python自制雷霆战机小游戏,娱乐编程,快乐学习!
- 460.LFU 缓存
- python写窗体程序_python写窗口
- 10-124 A3-4查询产品表中最大库存量
- SVM(支持向量机)
热门文章
- 计算机病毒手动查杀,电脑中毒了怎么办 如何手动彻底查杀病毒【解决方法】...
- GitOps 与 ChatOps 的落地实践
- mac自动给视频加字幕(ffmpeg,autosub)
- LTspice使用教程笔记
- git拉取指定分支上面的代码 提交本地分支到远程
- 1、股票交易及量化投资回测分析系统的数据库设计-5
- Django REST framework+Vue 打造生鲜超市(十)
- 【android】android真机测试方法
- pm2 : 无法加载文件 C:\Users\zhanghuan\AppData\Roaming\npm\pm2.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 htt ps:/go.micr
- ffmpeg断流黑屏问题分析