首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

并发队列简介

并发包下面的并发容器中,ConcurrentLinkedQueue 这种 Concurrent 类型和的集合才真正代表并发。 ?...java.util.concurrent 包并发容器分类 Concurrent CopyOnWrite Blocking Concurrent 类型集合 Concurrent 类型没有类似 CopyOnWrite...在常规队列操作基础上, Blocking意味着提供了特定的等待性操作。 阻塞队列 LinkedBlockingQueue 适用阻塞队列的好处,多线程操作共同的队列时不需要额外的同步。...void put(E e): 在队尾插入元素,方法在队列满的时候会阻塞直到有队列成员被消费 boolean offer(E e): 在队尾插入元素,方法在队列满的时候不会阻塞,直接返回 false E...take(): 取出并删除队列中的首元素,如果队列为空,会阻塞,直到有队列成员被放进来 E poll(): 取出并删除队列中的首元素,如果队列为空,则返回 null,不进行阻塞 E peek(): 取出第一个元素但是不删除它

42110
您找到你想要的搜索结果了吗?
是的
没有找到

java并发队列之阻塞队列-ArrayBlockingQueue

正文 什么是阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。...阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列有哪些?...*/ int count; /* * 并发控制使用经典的两条件算法 *发现在任何教科书。...put(e)队列未满时,直接插入没有返回值;队列满时会阻塞等待,一直等到队列未满时再插入。...InterruptedException { abq.put(i); System.out.println("存入了一个元素是 " + i); } } 下面看输出,很明显多线程也没有发生并发问题

87820

并发容器和队列

2.9.3 Java中的队列 队列是一种数据结构,他有先进先出的性质,这点他和栈的性质正好相反。一般使用都是在队列尾部加入元素和从队列头部移除元素,我们经常把他使用在并发环境下。...LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争最多降到一半。...运行结果如下,可以看出多线程并发也没有发生线程安全问题,而且体现出队列是先入先出。...put/take方法可以实现在队列已满或空的时候达到线程阻塞状态,阻塞这种方式在线程并发时固然安全,但是也会造成效率上的问题,所以说今天我们来讲一个非阻塞队列——ConcurrentLinkedQueue...,他能保证并发安全,而且还可以提高效率。

34220

并发队列 – 有界阻塞队列 ArrayBlockingQueue 原理探究

如图ArrayBlockingQueue内部有个数组items用来存放队列元素,putindex下标标示入队元素下标,takeIndex是出队下标,count统计队列元素个数,从定义可知道并没有使用volatile...另外构造函数必须传入队列大小参数,所以为有界队列,默认是Lock为非公平锁。...四、put操作 在队列尾部添加元素,如果队列满则等待队列有空位置插入后返回 publicvoidput(E e) throwsInterruptedException { checkNotNull...然后看了其他并发类里面凡是调用了await的方法获取锁时候都是使用的lockInterruptibly方法而不是Lock也验证了这个想法。...操作 从队头获取元素,如果队列为空则阻塞直到队列有元素。

55640

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

转载自https://blog.csdn.net/westos_linux/article/details/78968012 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列...Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列...并行和并发区别 1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑; 2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B...,take方法在队列空的时候会阻塞,直到有队列成员被放进来。...take和put方法,这两个方法正是队列操作的阻塞版本。

81420

并发队列-无界阻塞队列LinkedBlockingQueue原理探究

InterruptedException retry) { timedOut = false; } } } 十二、总结 12.1 并发安全总结...仔细思考下阻塞队列是如何实现并发安全的维护队列链表的,先分析下简单的情况就是当队列里面有多个元素时候,由于同时只有一个线程(通过独占锁putLock实现)入队元素并且是操作last节点(,而同时只有一个出队线程...(通过独占锁takeLock实现)操作head节点,所以不存在并发安全问题。...image.png 考虑当队列为空的时候队列状态为: ?...而ConcurrentLinkedQueue则使用CAS非阻塞算法来实现,使用CAS原子操作保证链表构建的安全性,当多个线程并发时候CAS失败的线程不会被阻塞,而是使用cpu资源去轮询CAS直到成功,size

72030

Java并发队列原理剖析

allocationSpinLock是个自旋锁,通过CAS操作来保证同时只有一个线程可以扩容队列,状态为0或1。 由于这是一个优先队列,所以有一个comparator用来比较元素大小。.../ 由前面的代码可知,调用tryGrow函数前先获取了独占锁, // 由于扩容比较费时,此处先释放锁, // 让其他线程可以继续操作(如果满足可操作的条件的话), // 以提升并发性能...notEmpty.await(); } finally { lock.unlock(); } return result; } DelayQueue DelayQueue并发队列是一个无界阻塞延迟队列...,队列中的每一个元素都有一个过期时间,当从队列中获取元素时只有过期元素才会出列。...E take() 获取并移除队列里面过期的元素,如果队列里面没有过期元素则等待。

23430

并发阻塞队列BlockingQueue解读

并发阻塞队列BlockingQueue解读 引言 BlockingQueue 实现之 ArrayBlockingQueue 源码解读 构造函数 offer poll 循环队列 add remove put...其并发控制采用可重入锁来控制,不管是插入操作还是读取操作,都需要获取到锁才能进行操作。...这里说的并不是多线程的并发问题,而是因为当一个线程往队列中写入一个元素时,写入操作不会立即返回,需要等待另一个线程来将这个元素拿走;同理,当一个读线程做读操作的时候,同样需要一个相匹配的写线程的写操作。...---- BlockingQueue 实现之 PriorityBlockingQueue 带排序的 BlockingQueue 实现,其并发控制采用的是 ReentrantLock,队列为无界队列(ArrayBlockingQueue...PriorityBlockingQueue 使用了基于数组的二叉堆来存放元素,所有的 public 方法采用同一个 lock 进行并发控制。

60520

解读 Java 并发队列 BlockingQueue

本文直接参考 Doug Lea 写的 Java doc 和注释,这也是我们在学习 java 并发包时最好的材料了。...其并发控制采用可重入锁来控制,不管是插入操作还是读取操作,都需要获取到锁才能进行操作。...首先,这里用一个示意图来看看 LinkedBlockingQueue 的并发读写控制,然后再开始分析源码: ?...这里说的并不是多线程的并发问题,而是因为当一个线程往队列中写入一个元素时,写入操作不会立即返回,需要等待另一个线程来将这个元素拿走;同理,当一个读线程做读操作的时候,同样需要一个相匹配的写线程的写操作。...PriorityBlockingQueue 带排序的 BlockingQueue 实现,其并发控制采用的是 ReentrantLock,队列为无界队列(ArrayBlockingQueue 是有界队列

54641

解读 Java 并发队列 BlockingQueue

本文直接参考 Doug Lea 写的 Java doc 和注释,这也是我们在学习 java 并发包时最好的材料了。...其并发控制采用可重入锁来控制,不管是插入操作还是读取操作,都需要获取到锁才能进行操作。...首先,这里用一个示意图来看看 LinkedBlockingQueue 的并发读写控制,然后再开始分析源码: 看懂这个示意图,源码也就简单了,读操作是排好队的,写操作也是排好队的,唯一的并发问题在于一个写操作和一个读操作同时进行...这里说的并不是多线程的并发问题,而是因为当一个线程往队列中写入一个元素时,写入操作不会立即返回,需要等待另一个线程来将这个元素拿走;同理,当一个读线程做读操作的时候,同样需要一个相匹配的写线程的写操作。...BlockingQueue 实现之 PriorityBlockingQueue 带排序的 BlockingQueue 实现,其并发控制采用的是 ReentrantLock,队列为无界队列(ArrayBlockingQueue

64110

Java并发编程:阻塞队列

Java并发编程:阻塞队列   在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList)...一.几种主要的阻塞队列   二.阻塞队列中的方法 VS 非阻塞队列中的方法   三.阻塞队列的实现原理   四.示例和使用场景   若有不正之处请多多谅解,并欢迎批评指正。   ...二.阻塞队列中的方法 VS 非阻塞队列中的方法 1.非阻塞队列中的几个主要方法:   add(E e):将元素e插入到队列末尾,如果插入成功,则返回true;如果插入失败(即队列已满),则会抛出异常;...2.阻塞队列中的几个主要方法:   阻塞队列包括了非阻塞队列中的大部分方法,上面列举的5个方法在阻塞队列中都存在,但是要注意这5个方法在阻塞队列中都进行了同步措施。...在并发编程中,一般推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。

97640

Java并发队列与容器

【前言:无论是大数据从业人员还是Java从业人员,掌握Java高并发和多线程是必备技能之一。...本文主要阐述Java并发包下的阻塞队列并发容器,其实研读过大数据相关技术如Spark、Storm等源码的,会发现它们底层大多用到了Java并发队列、同步类容器、ReentrantLock等。...建议大家结合本篇文章,仔细分析一下相关源码】 BlockingQueue 阻塞队列,位于java.util.concurrent并发包下,它很好的解决了多线程中如何安全、高效的数据传输问题。...put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。...因此不同的segment之间可以并发使用,极大地提高了性能。

44130

并发编程之阻塞队列

并发编程之阻塞队列 1....什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附加操作:...当队列中为空时,从队列中获取元素的操作将被阻塞;当队列满时,向队列中添加元素的操作将被阻塞。...阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器。 阻塞队列提供了四种操作方法: ?...LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争最多降到一半。

34840

并发队列-无界阻塞延迟队列DelayQueue原理探究

一、前言 DelayQueue队列中每个元素都有个过期时间,并且队列是个优先级队列,当从队列获取元素时候,只有过期元素才会出队列。 二、 DelayQueue类图结构 ?...另外队列里面的元素要实现Delayed接口,一个是获取当前剩余时间的接口,一个是元素比较的接口,因为这个是有优先级的队列。 三、offer操作 插入元素到队列,主要插入元素要实现Delayed接口。...四、take操作 获取并移除队列首元素,如果队列没有过期元素则等待。...(6)说明当前take返回了元素,如果当前队列还有元素则调用singal激活条件队列里面可能有的等待线程。...,那么这个队列就是一个重试队列,一个线程通过take方法获取需要重试的接口,take返回则接口进行重试,失败则再次放入队列,同时也可以在元素加上重试次数。

84720

并发队列-无界非阻塞队列ConcurrentLinkedQueue原理探究

一、 前言 常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好,下面就看看常用的非阻塞ConcurrentLinkedQueue是如何使用...,在并发环境下不是很有用,因为使用CAS没有加锁所以从调用size函数到返回结果期间有可能增删元素,导致统计的元素个数不精确。...,由于是遍历整个队列,所以类似size 不是那么精确,有可能调用该方法时候元素还在队列里面,但是遍历过程中才把该元素删除了,那么就会返回false. public boolean contains(Object...也就是说当构造Node节点时候(这时候节点还没有放入队列链表)为了避免正常的写volatile变量的开销 使用了Unsafe.putObject代替。这使元素进队列仅仅花费1.5个cas操作的耗时。...由于使用CAS没有使用锁,所以获取size的时候有可能进行offer,poll或者remove操作,导致获取的元素个数不精确,所以在并发情况下size函数不是很有用。

47210

Java并发阻塞队列之ArrayBlockingQueue

JUC简介 在 Java 5.0 提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池,异步IO和轻量级任务框架...在第三个构造函数中提供了初始化队列数组中数据的方法。 加入队列 ArrayBlockingQueue提供了4个方法将元素添加入队列。...offer(E e) :如果立即可行且不会超过该队列的容量,将指定的元素插入到此队列的尾部。成功返回true,队列已满则返回false。...然后获得锁进行队列大小(count记录了队列中元素的个数)比较,如果当前队列中的元素个数与count相等,则返回false,不进行插入。否则,将元素插入队列,并返回true。...取出队列 ArrayBlockingQueue提供了以下方法支持取出队列: - poll() :获取并移除此队列的头,如果队列为空,则返回null。

37220

015.多线程-并发队列

并发队列上JDK提供了两套实现, 一个是以ConcurrentLinkedQueue为代表的高性能队列, 一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。...---- ConcurrentLinkedQueue ConcurrentLinkedQueue : 是一个适用于高并发场景下的队列, 通过无锁的方式,实现了高并发状态下的高性能, 通常ConcurrentLinkedQueue...它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。 头是最先加入的,尾是最近加入的,该队列不允许null元素。...---- BlockingQueue 在队列为空时,获取元素的线程会等待队列变为非空。 当队列满时,存储元素的线程会等待队列可用。...阻塞队列常用于生产者和消费者的场景 ArrayBlockingQueue ArrayBlockingQueue是一个有边界的阻塞队列,它的内部实现是一个数组。

52520
领券