Java并发编程之队列

Deque(双端队列)
子接口BlockingDeque,实现类如下:
- ArrayDeque:大下可变的数组双端队列,不允许插入null
 - LinkedList:大小可变的链表双端队列,允许插入null
 - ConcurrentLinkedDeque:大小可变且线程安全的链表双端队列,非阻塞,不允许插入null(自旋+CAS)
 - LinkedBlockingDeque:为线程安全的双端队列,在队列为空的情况下,获取操作将会阻塞,直到有元素添加(ReentrantLock+两个Condition实现)
 

非堵塞队列
PriorityQueue:基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素
ConcurrentLinkedQueue:基于链接节点的无界线程安全队列(自旋+CAS),它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素
BlockingQueue(堵塞队列)

- ArrayBlockingQueue :基于数组构建的有界堵塞队列,通过ReentrantLock+两个Condition(队列为空堵塞、队列满了堵塞)实现堵塞,支持公平性,即等待时间最长的线程会优先得到处理
 - LinkedBlockingQueue :基于链表构建的可选有界堵塞队列,默认容量为Integer.MAX_VALUE,通过两对ReentrantLock+Condition实现堵塞,putLock和takeLock(put、take分别操作链表的两端,所以需要两把锁)
 - PriorityBlockingQueue :基于堆(PriorityQueue封装)构建的无界优先级队列(容量无限制,put非堵塞),通过ReentrantLock+Condition实现take操作堵塞(队列为空),Comparator实现优先级排序
 - DelayQueue:基于堆(PriorityQueue封装)构建的无界堵塞延迟队列,通过ReentrantLock+Condition实现take堵塞(先查看队列头部元素是否到期,未到期wait指定时长,自旋再次获取)
 - SynchronousQueue :本身不存放任何元素。插入元素到队列的线程被阻塞,直到另一个线程从队列中获取了队列中存储的元素。同样,如果线程尝试获取元素并且当前不存在任何元素,则该线程将被阻塞,直到线程将元素插入队列。通过LockSupport的park/unpark方法实现堵塞,同步也采用了ReentrantLock+自旋
 
Java并发编程之队列的更多相关文章
- Java并发编程-阻塞队列(BlockingQueue)的实现原理
		
背景:总结JUC下面的阻塞队列的实现,很方便写生产者消费者模式. 常用操作方法 常用的实现类 ArrayBlockingQueue DelayQueue LinkedBlockingQueue Pri ...
 - Java并发编程——阻塞队列BlockingQueue
		
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
 - java并发编程阻塞队列
		
在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(LinkedList是双向链表,它实现了Dequeue接口). 使用非阻塞队列的时候有一个很大问题就是:它不会 ...
 - Java并发编程-阻塞队列
		
Java concurrent 包中BlockingQueue接口有ArrayBlockingqueue.LinkedBlockingQueue.PriorityBlockingQueue.Synch ...
 - 【Java并发编程实战】----- AQS(四):CLH同步队列
		
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
 - 【Java并发编程实战】-----“J.U.C”:CLH队列锁
		
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...
 - Java并发编程:阻塞队列(转载)
		
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...
 - 【转】Java并发编程:阻塞队列
		
在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...
 - 12、Java并发编程:阻塞队列
		
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...
 
随机推荐
- Code Book All In One
			
Code Book All In One Jupyter Notebook Jupyter Lab https://jupyter.org/ Storybook https://storybook.j ...
 - Awesome Gatsby blog websites
			
Awesome Gatsby blog websites very simple very clean i18n dark mode (css var) demos https://overreact ...
 - blogs & cnblogs
			
blogs & cnblogs https://www.cnblogs.com/xgqfrms https://i.cnblogs.com/diaries https://i.cnblogs. ...
 - ES-Next classes static properties
			
ES-Next classes static properties https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...
 - NGK算力持有好处多多!SPC、VAST等免费拿!
			
众所周知,NGK是分布式存储的,作为Web3.0以及数字经济时代的基础设施,为数字加密市场带来了全新的商业模式和经济业态,但是,这只是一个重要的起点,真正的价值还在后面! 为了满足NGK生态建设者强烈 ...
 - Techme INC:红光和近红外光疗法有效加速肌肉恢复,美国橄榄球队已采用
			
Techme INC创始人兼董事长MADELEINE VAUGHAN表示:在运动结束后,肌肉纤维因为细微损伤造成酸痛情形,即是延迟性肌肉酸痛-DOMS.这类酸痛发生时,需要适度的恢复,避免造成肌肉拉伤 ...
 - java数据类型(进阶篇)
			
public class note03 { public static void main(String[] args) { //数据类型拓展 //1.整数拓展 //进制: 二进制0b 十进制 八进制 ...
 - Flex实现复杂布局
			
巧妙利用边框(或者背景颜色)来进行布局. 填上内容和图片(由设计提供切图). 去掉边框. css .business-content-1 { display: flex; /* 弹性布局 */ mar ...
 - 喜忧参半的SQL Server触发器
			
SQL Server触发器在非常有争议的主题.它们能以较低的成本提供便利,但经常被开发人员.DBA误用,导致性能瓶颈或维护性挑战. 本文简要回顾了触发器,并深入讨论了如何有效地使用触发器,以及何时触发 ...
 - 卧槽,好强大的魔法,竟能让Python支持方法重载
			
1. 你真的了解方法重载吗? 方法重载是面向对象中一个非常重要的概念,在类中包含了成员方法和构造方法.如果类中存在多个同名,且参数(个数和类型)不同的成员方法或构造方法,那么这些成员方法或构造方法就被 ...