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

在之前的文章中已经为大家介绍了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高性能队列实现的异步日志
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列的更多相关文章
- java并发编程工具类JUC第三篇:DelayQueue延时队列
DelayQueue 是BlockingQueue接口的实现类,它根据"延时时间"来确定队列内的元素的处理优先级(即根据队列元素的"延时时间"进行排序).另一层 ...
- java并发编程工具类JUC第七篇:BlockingDeque双端阻塞队列
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
- java并发编程工具类JUC第八篇:ConcurrentHashMap
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
- java并发编程工具类JUC第二篇:ArrayBlockingQueue
类ArrayBlockingQueue是BlockingQueue接口的实现类,它是有界的阻塞队列,内部使用数组存储队列元素.这里的"有界"是指存储容量存在上限,不能无限存储元素. ...
- java并发编程工具类JUC第一篇:BlockingQueue阻塞队列
Java BlockingQueue接口java.util.concurrent.BlockingQueue表示一个可以存取元素,并且线程安全的队列.换句话说,当多线程同时从 JavaBlocking ...
- Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo
Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...
- java并发编程工具类辅助类:CountDownLatch、CyclicBarrier和 Semaphore
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下 ...
- Java并发编程入门,看这一篇就够了
Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容.这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中涉 ...
- JUC : 并发编程工具类的使用
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.JUC是什么 1.JUC定义 JUC,即java.util.concurrent 在并发编程中使用的 ...
随机推荐
- Periodic Strings UVA - 455
A character string is said to have period k if it can be formed by concatenating one or more repet ...
- centos7安装kubernetes k8s 1.18
可以参考其他网友的阿里云搭建k8s高可用集群(1.17.3) https://www.cnblogs.com/gmmy/p/12372805.html 准备四台centos7虚拟机,用来安装k8s集群 ...
- OOP-面向对象(三)
魔术方法的使用 # 使用 __new__ 创建单态模式 class Singleton(): __obj = None def __new__(cls, *args, **kwargs): if cl ...
- JS 中一些高效的魔法运算符
这两天有同事说我挺久没更新文章了,不过最近一段时间确实有点忙,一直在忙着两个活动中心的改版,没什么时间来更新文章.今天终于抽空可以写一写. JavaScript 现在每年都会发一个新版本,里面也会新增 ...
- 适用于分布式ID的雪花算法
基于Java实现的适用于分布式ID的雪花算法工具类,这里存一下日后好找 /** * 雪花算法生成ID */ public class SnowFlakeUtil { private final sta ...
- maven自动化构建工具
目录结构: 一.Maven简介 二.Maven核心概念 三.Maven的使用 四.Maven在IDEA中的应用 五.依赖管理 六.Maven常用设置 ------------------------- ...
- JMeter日志查看
- POJ1258最小生成树简单题
题意: 给你个图,让你求一颗最小生成树. 思路: 裸题,克鲁斯卡尔或者普利姆都行. #include<stdio.h> #include<algorithm&g ...
- node-Get&POST
Node.js GET/POST请求 var http = require('http'); var url = require('url'); var util = require('util'); ...
- 【dependencyManagement版本管理】dependencies.dependency.version is missing
maven 的gav的v(版本问题) 报错dependencies.dependency.version is missing 出现的场景 一个项目中有多个模块 父模块中出现dependencies. ...