阻塞队列LinkedBlockingQueue和ArrayBlockingQueue的区别

LinkedBlockingQueue和ArrayBlockingQueue都是Java中常用的阻塞队列实现类,它们之间的主要区别如下

1、数据结构不同:LinkedBlockingQueue采用链表实现,而ArrayBlockingQueue采用数组实现。

2、容量限制不同:ArrayBlockingQueue在创建时需要指定容量,而LinkedBlockingQueue则可以在创建时不指定容量,或者指定一个可选的容量参数,如果不指定容量,则默认容量为Integer.MAX_VALUE。

3、队列的操作性能不同:LinkedBlockingQueue对于元素的插入和删除操作,由于采用链表实现,因此性能比较高。而对于随机访问元素的操作,由于需要遍历链表,因此性能比较低。ArrayBlockingQueue对于插入和删除操作,由于采用数组实现,因此性能比较低,而对于随机访问操作,性能比较高。

4、GC压力:LinkedBlockingQueue内部维护的是一个链表结构,在生产和消费的时候,需要创建Node对象进行插入或移除,大批量数据的系统中,其对于GC的压力比较大。而ArrayBlockingQueue内部维护了一个数组,在生产和消费的时候,是直接将枚举对象插入或移除的,不会产生或销毁任何额外的对象实例。

5、clear()机制不同:LinkedBlockingQueue的clear()方法中,会加两把锁。ArrayBlockingQueue的clear()方法中只加一把锁。

6、锁机制不同:LinkedBlockingQueue中的锁是分离的,生产者的锁为putLock,消费者的锁为takeLock。而ArrayBlockingQueue生产者和消费者使用的是同一把锁。

7、LinkedBlockingQueue和ArrayBlockingQueue都是阻塞队列,支持阻塞操作。内部是使用ReentrantLock和Condition来保证生产和消费的同步;当队列为空,消费线程被阻塞;当队列装满,生产线程被阻塞。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容