【高并发】不废话,言简意赅介绍BlockingQueue

写在前面

最近,有很多网友留言提问:在Java的并发编程中,有个BlockingQueue,它是个阻塞队列,为什么要在并发编程里使用BlockingQueue呢?好吧,今天,就临时说一下BlockingQueue吧,不过今天说的不是很深刻,后面我们一块儿从源头上深刻剖析这个类。编程

BlockingQueue概述

阻塞队列,是线程安全的。数组

被阻塞的状况以下:缓存

(1)当队列满时,进行入队列操做
(2)当队列空时,进行出队列操做安全

使用场景以下:微信

主要在生产者和消费者场景。并发

BlockingQueue的方法高并发

BlockingQueue 具备 4 组不一样的方法用于插入、移除以及对队列中的元素进行检查。若是请求的操做不能获得当即执行的话,每一个方法的表现也不一样。这些方法以下:学习

抛出异常 特殊值 阻塞 超时
插入 add(e) offer(e) put(e) offer(e, time, unit)
移除 remove() poll() take() poll(time, unit)
检查 element() peek() 不可用 不可用


四组不一样的行为方式解释线程

  • 抛出异常

若是试图的操做没法当即执行,抛一个异常。对象

  • 特殊值

若是试图的操做没法当即执行,返回一个特定的值(经常是 true / false)。

  • 阻塞

若是试图的操做没法当即执行,该方法调用将会发生阻塞,直到可以执行。

  • 超时

若是试图的操做没法当即执行,该方法调用将会发生阻塞,直到可以执行,但等待时间不会超过给定值。返回一个特定值以告知该操做是否成功(典型的是 true / false)。

BlockingQueue的实现类

  • ArrayBlockingQueue:有界的阻塞队列(容量有限,必须在初始化的时候指定容量大小,容量大小指定后就不能再变化),内部实现是一个数组,以FIFO的方式存储数据,最新插入的对象是尾部,最新移除的对象是头部。
  • DelayQueue:阻塞的是内部元素,DelayQueue中的元素必须实现一个接口——Delayed(存在于J.U.C下)。Delayed接口继承了Comparable接口,这是由于Delayed接口中的元素须要进行排序,通常状况下,都是按照Delayed接口中的元素过时时间的优先级进行排序。应用场景主要有:定时关闭链接、缓存对象、超时处理等。内部实现使用PriorityQueue和ReentrantLock。
  • LinkedBlockingQueue:大小配置是可选的,若是初始化时指定了大小,则是有边界的;若是初始化时未指定大小,则是无边界的(其实默认大小是Integer类型的最大值)。内部实现时一个链表,以FIFO的方式存储数据,最新插入的对象是尾部,最新移除的对象是头部。
  • PriorityBlockingQueue:带优先级的阻塞队列,无边界,可是有排序规则,容许插入空对象(也就是null)。全部插入的对象必须实现Comparable接口,队列优先级的排序规则就是按照对Comparable接口的实现来定义的。能够从PriorityBlockingQueue中得到一个迭代器Iterator,但这个迭代器并不保证按照优先级的顺序进行迭代。
  • SynchronousQueue:队列内部仅容许容纳一个元素,当一个线程插入一个元素后,就会被阻塞,除非这个元素被另外一个线程消费。所以,也称SynchronousQueue为同步队列。SynchronousQueue是一个无界非缓存的队列。准确的说,它不存储元素,放入元素只有等待取走元素以后,才能再次放入元素。

写在最后

若是以为文章对你有点帮助,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发编程技术。

最后,附上并发编程须要掌握的核心技能知识图,祝你们在学习并发编程时,少走弯路。

sandahexin_20200322

相关文章
相关标签/搜索