java中LinkedBlockingQueue与ArrayBlockingQueue的异同
相同:
1、linkedblockingqueue和arrayblockingqueue都实现了blockingqueue接口;
2、linkedblockingqueue和arrayblockingqueue都是可阻塞的队列
内部都是使用reentrantlock和condition来保证生产和消费的同步;
当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞;
使用condition的方法来同步和通信:await()和signal()
不同:
1、由上图可以看出,他们的锁机制不同
linkedblockingqueue中的锁是分离的,生产者的锁putlock,消费者的锁takelock
而arrayblockingqueue生产者和消费者使用的是同一把锁;
2、他们的底层实现机制也不同
linkedblockingqueue内部维护的是一个链表结构
在生产和消费的时候,需要创建node对象进行插入或移除,大批量数据的系统中,其对于gc的压力会比较大
而arrayblockingqueue内部维护了一个数组
在生产和消费的时候,是直接将枚举对象插入或移除的,不会产生或销毁任何额外的对象实例
3、构造时候的区别
linkedblockingqueue有默认的容量大小为:integer.max_value,当然也可以传入指定的容量大小
arrayblockingqueue在初始化的时候,必须传入一个容量大小的值
看其提供的构造方法就能知道
4、执行clear()方法
linkedblockingqueue执行clear方法时,会加上两把锁
5、统计元素的个数
linkedblockingqueue中使用了一个atomicinteger对象来统计元素的个数
arrayblockingqueue则使用int类型来统计元素
推荐阅读
-
java中LinkedBlockingQueue与ArrayBlockingQueue的异同
-
Java中JSON字符串与java对象的互换实例详解
-
详解java中Reference的实现与相应的执行过程
-
详解java中finalize的实现与相应的执行过程
-
Java中数组的创建与传参方法(学习小结)
-
Java中JSON字符串与java对象的互换实例详解
-
java中LinkedBlockingQueue与ArrayBlockingQueue的异同
-
Java中Scanner类与BufferReader类的不同点(非常详细)
-
基于java中byte数组与int类型的转换(两种方法)
-
Java中volatile关键字的作用与用法详解