关于spring:java并发编程工具类JUC第四篇LinkedBlockingQueue链表队列

3次阅读

共计 1503 个字符,预计需要花费 4 分钟才能阅读完成。

在之前的文章中曾经为大家介绍了 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 深入浅出系列》
正文完
 0