Disruptor:高性能的生产者-消费者的无锁实现

Disruptor:

在Disruptor中使用环形队列RingBuffer来代替普通的线性队列(内部实现是普通的数组),Disruptor要求将数组的大小设置为2的整数次方。这样通过sequence&(queueSequence-1)就能快速定位元素的位置。
disruptor示例demo

选择合适的策略 提高消费者的响应时间

Disruptor:高性能的生产者-消费者的无锁实现_第1张图片
WaitStrategy.png

当生产者产生数据时,消费者是如何监控到缓冲区中的信息?Disruptor给出几种策略:

BlockingWaitStrategy:这是默认的策略。使用锁与条件进行数据的监控与唤醒。因为涉及到线程的切换,BlockingWaitStrategy策略是最省CPU,但是在高并发的状态下性能最差。
SleepingWaitStrategy: 对CPU的使用也是保守,会在循环中不断地等待数据。它会先进行自旋等待,如果不成功,则会使用Thread.yield()让出CPU,并最终使用LockSupport.parkNanos(1)进行线程休眠。典型的使用场景异步日志。
YieldingWaitStrategy:适用于低延迟的场景。消费者线程会不断循环监控缓冲区变化。
BusySpinWaitStrategy:最疯狂的等待策略,会吃掉所有的CPU资源,只有在对延迟非常苛刻的场合可以考虑使用。

你可能感兴趣的:(Disruptor:高性能的生产者-消费者的无锁实现)