java 阻塞队列 LinkedBlockingQueue

简述

  1. LinkedBlockingQueue可以是有界的也可以是*的(Integer.MAX_VALUE);它如果不指定容量,默认为Integer.MAX_VALUE,也就是*队列。所以为了避免队列过大造成机器负载或者内存爆满的情况出现,我们在使用的时候建议手动传一个队列的大小

总结

java 阻塞队列 LinkedBlockingQueue

LinkedBlockingQueue与ArrayBlockingQueue 区别

  • 队列大小有所不同,ArrayBlockingQueue是有界的初始化必须指定大小,而LinkedBlockingQueue可以是有界的也可以是*的(Integer.MAX_VALUE),对于后者而言,当添加速度大于移除速度时,在*的情况下,可能会造成内存溢出等问题
  • 数据存储容器不同 ,ArrayBlockingQueue采用的是数组作为数据存储容器,而LinkedBlockingQueue采用的则是以Node节点作为连接对象的链表
  • 由于ArrayBlockingQueue采用的是数组的存储容器,因此在插入或删除元素时不会产生或销毁任何额外的对象实例,而LinkedBlockingQueue则会生成一个额外的Node对象。这可能在长时间内需要高效并发地处理大批量数据的时,对于GC可能存在较大影响
  • ArrayBlockingQueue实现的队列中的锁是没有分离的,即添加操作和移除操作采用的同一个ReenterLock锁,而LinkedBlockingQueue实现的队列中的锁是分离的,其添加采用的是putLock,移除采用的则是takeLock

参考

深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
【细谈Java并发】谈谈LinkedBlockingQueue