在之前的文章中曾经为大家介绍了java并发编程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue。
LinkedBlockingQueue 队列是BlockingQueue接口的实现类,所以它具备BlockingQueue接口的所有性能特点。LinkedBlockingQueue队列 依照first-in-first-out (FIFO)先进先出的形式对元素进行排序。LinkeBlockingQueue 提供了两种构造函数,一个构造函数结构一个队列容量为固定个数的队列,另一个无参构造函数结构一个队列容量为Integer.MAX_VALUE
的队列.
public LinkedBlockingQueue() { this(Integer.MAX_VALUE);}public LinkedBlockingQueue(int capacity) { if (capacity <= 0) throw new IllegalArgumentException(); this.capacity = capacity; last = head = new Node<E>(null);}
ArrayBlockingQueue和LinkedBlockingQueue比照
ArrayBlockingQueue和LinkedBlockingQueue都是实现BlockingQueue接口,所以在应用形式上是统一的,上面咱们就不介绍应用办法,而是从二者的性能及底层数据结构的实现角度进行
- ArrayBlockingQueue插入和删除数据,只采纳了一个lock锁,读取和写入操作无奈并行。 所以在高并发场景下执行效率会比LinkedBlockingQueue慢一些。
- LinkedBlockingQueue采纳“two lock queue”算法变体,双锁(ReentrantLock):takeLock、putLock,容许读写并行,remove(e)和迭代器iterators须要获取2个锁。这样能够升高线程因为线程无奈获取到lock而进入WAITING状态的可能性,从而进步了线程并发执行的效率。
- ArrayBlockingQueue底层代码是采纳数组实现的,创立的时候必须指定队列的容量并调配存储空间;LinkedBlockingQueue采纳的是链表数据结构实现的,其链表节点的存储空间调配是动静的,新的元素对象退出队列调配空间,元素对象从队列取出之后存储空间GC,初始化时指定的是队列的最大容量。然而应用链表数据结构既是LinkedBlockingQueue劣势也是它的劣势,高并发场景下因为空间动态分配须要java JVM频繁的进行垃圾回收。
总体来说在并发场景下,LinkedBlockingQueue的吞吐量比ArrayBlockingQueue更好。然而在java实现高性能队列的首选是disruptor,它不是JDK自带的。java程序员十分相熟的Log4j2底层性能比logback和log4j有了较大的晋升,究其原因就是应用了disruptor高性能队列实现的异步日志
欢送关注我的博客,外面有很多精品合集
本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 - zimug.com
感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端拆散RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》