LinkedBlockingQueue:不同于ArrayBlockingQueue它如果不指定容量,默認为Integer.MAX_VALUE
也就是无界队列。所以为了避免队列过大造成机器负载或者内存爆满的情况出现我们在使用的时候建议手动传一个队列的大小
- 队列大小有所不同,ArrayBlockingQueue是有界的初始化必须指定大小而LinkedBlockingQueue可以是有界的也可以是无界的(Integer.MAX_VALUE),对于后者而言当添加速度大于移除速度时,在无界嘚情况下可能会造成内存溢出等问题。
- 数据存储容器不同ArrayBlockingQueue采用的是数组作为数据存储容器,而LinkedBlockingQueue采用的则是以Node节点作为连接对象的链表
- 由于ArrayBlockingQueue采用的是数组的存储容器,因此在插入或删除元素时不会产生或销毁任何额外的对象实例而LinkedBlockingQueue则会生成一个额外的Node对象。这可能在長时间内需要高效并发地处理大批量数据的时对于GC可能存在较大影响。
- 两者的实现队列添加或移除的锁不一样ArrayBlockingQueue实现的队列中的锁是没囿分离的,即添加操作和移除操作采用的同一个ReenterLock锁而LinkedBlockingQueue实现的队列中的锁是分离的,其添加采用的是putLock移除采用的则是takeLock,这样能大大提高隊列的吞吐量也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能