Disruptor的使用方法
- 生产消费针对对象event,定义Event
- 构造Disruptor时候需要实现一个EventFactory,这里是LongEvent::new
- 消费者要注册是一个handleEvent
- 生产者要通过publishEvent
1 | // 自定义 Event |
Disruptor高效的要点
- 数据结构采用RingBuffer并且针对RingBuffer做了如下的优化,初始化时候利用EventFactory的newInstance方法创建所有的元素,
- 由于一起创建所以这些元素在内存地址上是连续的,在消费元素时候有效的理由了CPU缓存(程序的局部性)当消费元素a的时候,a+1会加载到CPU的cashe中。
- 在生产元素时候,利用setEvent这种方式重用对象,避免重新创建对象频繁的gc
- 解决伪缓存的方式:利用内存填充的方式防止变量共享一个缓存行,在无锁的并发情况下导致缓存行重复失效。
- CAS的无锁设计高效生产消费队列
1 | // 生产者获取 n 个写入位置 |