Java 内部的消息队列主要有以下几种:
队列 | 有界性 | 锁 | 结构 | 队列类型 |
---|---|---|---|---|
ArrayBlockingQueue | 有界 | 加锁 | 数组 | 阻塞 |
LinkedBlockingQueue | 可选 | 加锁 | 链表 | 阻塞 |
ConcurrentLinkedQueue | 无界 | 无锁 | 链表 | 非阻塞 |
LinkedTransferQueue | 无界 | 无锁 | 链表 | 阻塞 |
PriorityBlockingQueue | 无界 | 加锁 | 堆 | 阻塞 |
DelayQueue | 无界 | 加锁 | 堆 | 阻塞 |
通常情况下为防止生产者速度过快导致内存溢出,只能选择有界队列;为了减少垃圾回收对系统性能的影响,会尽量选择 Array/Heap 格式的数据结构,因此符合条件的队列就只有 ArrayBlockingQueue,但其底层使用加锁的方式进行处理,在高并发环境下效率低下,Disruptor 因此应运而生
Disruptor 类似 ArrayBlockingQueue,是一个高性能的线程间异步通信的队列框架( 即在同一个JVM进程中的多线程间消息传递 )一般用于线程间消息的传递。官方宣称基于Disruptor开发的系统单线程能支撑每秒600万订单