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