欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

程序员文章站 2024-03-13 19:54:15
相同: 1、linkedblockingqueue和arrayblockingqueue都实现了blockingqueue接口; 2、linkedblockingque...

相同:

1、linkedblockingqueue和arrayblockingqueue都实现了blockingqueue接口;

2、linkedblockingqueue和arrayblockingqueue都是可阻塞的队列

  内部都是使用reentrantlock和condition来保证生产和消费的同步;

  当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞;

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

使用condition的方法来同步和通信:await()和signal()

不同:

1、由上图可以看出,他们的锁机制不同

  linkedblockingqueue中的锁是分离的,生产者的锁putlock,消费者的锁takelock

  而arrayblockingqueue生产者和消费者使用的是同一把锁;

2、他们的底层实现机制也不同

  linkedblockingqueue内部维护的是一个链表结构

java中LinkedBlockingQueue与ArrayBlockingQueue的异同java中LinkedBlockingQueue与ArrayBlockingQueue的异同

在生产和消费的时候,需要创建node对象进行插入或移除,大批量数据的系统中,其对于gc的压力会比较大

  而arrayblockingqueue内部维护了一个数组

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

在生产和消费的时候,是直接将枚举对象插入或移除的,不会产生或销毁任何额外的对象实例

 3、构造时候的区别

  linkedblockingqueue有默认的容量大小为:integer.max_value,当然也可以传入指定的容量大小

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

  arrayblockingqueue在初始化的时候,必须传入一个容量大小的值

  看其提供的构造方法就能知道

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

4、执行clear()方法

  linkedblockingqueue执行clear方法时,会加上两把锁

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

 5、统计元素的个数

  linkedblockingqueue中使用了一个atomicinteger对象来统计元素的个数

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

  arrayblockingqueue则使用int类型来统计元素