- 时间:2020-05-19 01:11 编辑: 来源: 阅读:
- 扫一扫,手机访问
摘要:java中LinkedBlockingQueue与ArrayBlockingQueue的异同
[b]相同:[/b]
1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;
2、LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的队列
内部都是使用ReentrantLock和Condition来保证生产和消费的同步;
当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞;
[img]http://files.jb51.net/file_images/article/201608/201608201033238.png[/img]
[img]http://files.jb51.net/file_images/article/201608/201608201033239.png[/img]
使用Condition的方法来同步和通信:await()和signal()
[b]不同:[/b]
1、由上图可以看出,他们的锁机制不同
LinkedBlockingQueue中的锁是分离的,生产者的锁PutLock,消费者的锁takeLock
而ArrayBlockingQueue生产者和消费者使用的是同一把锁;
2、他们的底层实现机制也不同
LinkedBlockingQueue内部维护的是一个链表结构
[img]http://files.jb51.net/file_images/article/201608/2016082010332310.png[/img]
[img]http://files.jb51.net/file_images/article/201608/2016082010332311.png[/img]
在生产和消费的时候,需要创建Node对象进行插入或移除,大批量数据的系统中,其对于GC的压力会比较大
而ArrayBlockingQueue内部维护了一个数组
[img]http://files.jb51.net/file_images/article/201608/2016082010332312.png[/img]
在生产和消费的时候,是直接将枚举对象插入或移除的,不会产生或销毁任何额外的对象实例
3、构造时候的区别
LinkedBlockingQueue有默认的容量大小为:Integer.MAX_VALUE,当然也可以传入指定的容量大小
[img]http://files.jb51.net/file_images/article/201608/2016082010332313.png[/img]
ArrayBlockingQueue在初始化的时候,必须传入一个容量大小的值
看其提供的构造方法就能知道
[img]http://files.jb51.net/file_images/article/201608/2016082010332314.png[/img]
4、执行clear()方法
LinkedBlockingQueue执行clear方法时,会加上两把锁
[img]http://files.jb51.net/file_images/article/201608/2016082010332315.png[/img]
5、统计元素的个数
LinkedBlockingQueue中使用了一个AtomicInteger对象来统计元素的个数
[img]http://files.jb51.net/file_images/article/201608/2016082010332416.png[/img]
ArrayBlockingQueue则使用int类型来统计元素