Disruptor 基本原理
在多线程开发中,我们常常遇到这样一种场景:一些线程接受用户请求,另外一些线程处理这些请求。比如日志处理中的日志输入和告警。这种典型的生产者消费者场景十分常见,而生产者消费者模式的核心就是阻塞队列。由于阻塞队列会涉及大量的锁竞争和线程阻塞,都是非常耗费 CPU 的操作,因此阻塞队列的性能好坏能够在很大程度上决定上层应用的性能瓶颈。
JAVA 中用 BlockingQueue 这个接口来描述阻塞队列,有数组实现的有界阻塞队列为 ArrayBlockingQueue,用链表实现的无界阻塞队列为 LinkedBlockingQueue,除此之外还有优先级阻塞队列 PriorityBlockingQueue,这些阻塞队列除了自身特有逻辑外,都采用基于悲观锁的并发控制。这样的并发机制会有严重的锁冲突,大大影响并发性能。Disruptor 满足了我们的要求。
使用了 Ringbuffer,内存屏障,乐观并发控制等众多优化手段后,Disrupter 的阻塞队列与传统的阻塞队列相比有超过 10 倍的吞吐率。
Disruptor 的主要设计思想是无锁的高并发,在设计上采用内存屏障的机制和 CAS 操作实现此思想。主流的并发程序 都离不开锁对资源的管控,或者尽量避开锁的使用。
其主要的实现原理总结有如下三点:
- 采用消费者-生产者模型进行读写的分离。
- 用循环缓存(实际是一个循环队列)实现了数据的暂存和读写速度的匹配。
- 用内存屏障加序列号的方式实现了无锁的并发机制。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论