ArrayBlockingQueue与LinkedBlockingQueue区别

参考:https://cloud.tencent.com/developer/article/1340017

内存方面

ArrayBlockingQueue

用于存储队列元素的存储空间是预先分配的,使用过程中内存开销较小(无须动态申请存储空间)

LinkedBlockingQueue

用于存储队列元素的存储空间是在其使用过程中动态分配的,因此它可能会增加JVM垃圾回收的负担。

有界无界

ArrayBlockingQueue

有界,适合已知最大存储容量的场景

LinkedBlockingQueue

可有界可以无界

吞吐量

LinkedBlockingQueue在大多数并发的场景下吞吐量比ArrayBlockingQueue,但是性能不稳定。

Linked queues typically have higher throughput than array-based queues but less predictable performance in most concurrent applications.

这个主要针对LinkedBlockingQueue是无界的场景来说,由于无界,所以offer以及poll的吞吐量通常比ArrayBlockingQueue高。

应用场景

按照适用的并发强度从低到高排列如下:

LinkedList/ArrayList   非线程安全,不能用于并发场景(List的方法支持栈和队列的操作,因此可以用List封装成stack和queue)

Collections.synchronizedList   使用wrapper class封装,每个方法都用synchronized(mutex:Object)做了同步

LinkedBlockingQueue   采用了锁分离的设计,避免了读/写操作冲突,且自动负载均衡,可以有界。BlockingQueue在生产-消费模式下首选【Iterator安全,不保证数据一致性】

ConcurrentLinkedQueue  适用于高并发读写操作,理论上有最高的吞吐量,无界,不保证数据访问实时一致性,Iterator不抛出并发修改异常,采用CAS机制实现无锁访问。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容