美文网首页
阻塞队列LinkedBlockingQueue和ArrayBlo

阻塞队列LinkedBlockingQueue和ArrayBlo

作者: 业精于勤_荒于嬉 | 来源:发表于2023-07-09 09:38 被阅读0次

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来保证生产和消费的同步;当队列为空,消费线程被阻塞;当队列装满,生产线程被阻塞。

相关文章

网友评论

      本文标题:阻塞队列LinkedBlockingQueue和ArrayBlo

      本文链接:https://www.haomeiwen.com/subject/smfsudtx.html