java中有哪些队列呢
- ArrayBlockingQueue 使用ReentrantLock
- LinkedBlockingQueue 使用ReentrantLock
- ConcurrentLinkedQueue 使用CAS
- 等等
我们清楚使用锁的性能比较低,尽量使用无锁设计。接下来就我们来认识下Disruptor。
Disruptor简单使用
github地址:https://github.com/LMAX-Exchange/disruptor/wiki/Performance-Results
先简单介绍下:
- Disruptor它是一个开源的并发框架,并获得2011 Duke’s程序框架创新奖【Oracle】,能够在无锁的情况下实现网络的Queue并发操作。英国外汇交易公司LMAX开发的一个高性能队列,号称单线程能支撑每秒600万订单~
- 日志框架Log4j2 异步模式采用了Disruptor来处理
- 局限呢,他就是个内存队列,也就是说无法支撑分布式场景。
简单使用
数据传输对象
@Data
public class EventData {
private Long value;
}
消费者
public class EventConsumer implements WorkHandler<EventData> {
/**
* 消费回调
* @param eventData
* @throws Exception
*/
@Override
public void onEvent(EventData eventData) throws Exception {
Thread.sleep(5000);
System.out.println(Thread.currentThread() + ", eventData:" + eventData.getValue());
}
}
生产者
public class EventProducer {
private final RingBuffer<EventData> ringBuffer;
public EventProducer(RingBuffer<EventData> ringBuffer) {
this.ringBuffer = ringBuffer;
}
public void sendData(Long v){
// cas展位
long next = ringBuffer.next();
try {
EventData eventData = ringBuffer.get(next);
eventData.setValue(v);
} finally {
// 通知等待的消费者
System.out.println("EventProducer send success, sequence:"+next);
ringBuffer.publish(next);
}
}
}
测试类
public class DisruptorTest {
public static void main(String[] args) {
// 2的n次方
int bufferSize = 8;
Disruptor<EventData> disruptor = new Disruptor<EventData>(
() -> new EventData(), // 事件工厂
bufferSize, // 环形数组大小
Executors.defaultThreadFactory(), // 线程池工厂
ProducerType.MULTI, // 支持多事件发布者
new BlockingWaitStrategy()); // 等待策略
// 设置消费者
disruptor.handleEventsWithWorkerPool(
new EventConsumer(),
new EventConsumer(),