精华内容
下载资源
问答
  • 阻塞队列的实现原理

    2018-11-01 16:18:41
    现在貌似大多数网站用户认证都是基于 session ,即在服务端生成用户相关 session 数据,而发给客户端 sesssion_id 存放到 cookie 中,这样用客户端请求时带上 session_id 就可以验证服务器端是否存在 session ...

    阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法

    1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。

    2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空

    阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。

    在阻塞队列不可用时,这两个附加操作提供了4种处理方式

    抛出异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出 IllegalStateException("Queue full") 异常。当队列为空时,从队列里获取元素时会抛出 NoSuchElementException 异常 。

    返回特殊值:插入方法会返回是否成功,成功则返回 true。移除方法,则是从队列里拿出一个元素,如果没有则返回 null

    一直阻塞:当阻塞队列满时,如果生产者线程往队列里 put 元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者线程试图从队列里 take 元素,队列也会阻塞消费者线程,直到队列可用。

    超时退出:当阻塞队列满时,队列会阻塞生产者线程一段时间,如果超过一定的时间,生产者线程就会退出。

    如果是无界阻塞队列,队列不可能会出现满的情况,所以使用put或offer方法永远不会被阻塞,而且使用offer方法时,该方法永远返回true

     

    展开全文
  • 一,阻塞队列的实现原理: 1)阻塞队列原理: ​ 其实阻塞队列实现阻塞同步的方式很简单,使用的就是:lock锁+多个条件(condition)的阻塞控制。 ​ 使用BlockingQueue封装了根据condition条件阻塞线程的过程,...

    一,阻塞队列的实现原理:

    1)阻塞队列原理:

    ​ 其实阻塞队列实现阻塞同步的方式很简单,使用的就是:lock锁+多个条件(condition)的阻塞控制。

    ​ 使用BlockingQueue封装了根据condition条件阻塞线程的过程,使得我们不用去关心繁琐的await/signal操作了。

    ​ 阻塞队列的最常使用的例子就是生产者消费者模式,也是各种实现生产者消费者模式方式中首选的方式。使用者不用关心什么阻塞生产,什么时候阻塞消费,使用非常方便,

    补充:双端阻塞队列(BlockingDeque)

    ​ concurrent包下还提供双端阻塞队列(BlockingDeque),和BlockingQueue是类似的,只不过BlockingDeque可以从任意一端,进行插入或者抽取元素。


    二,说几种主要的阻塞队列 / BlockingQueue阻塞队列的实现类:

    BlockingQueue 是个接口,你需要使用它的实现之一来使用BlockingQueue,
    java.util.concurrent包下,具有以下这几个BlockingQueue 接口的实现类:

    引用1:

    有界队列:有界队列的意思就是,该队列它不能够存储无限多数量的元素。

    无界队列:无界队列的意思相反,就是该队列存储的元素数量没有界限;

    引用2:

    公平的访问队列:

    ​ 所谓公平的访问队列是指:本来阻塞着的所有生产者线程或者消费者线程,当队列重新变的可用时,可以按照阻塞的先后顺序来访问队列

    ​ 即, 先阻塞的生产者线程,可以先往队列中插入元素;

    ​ 先阻塞的消费者线程,可以先从队列中获取元素;

    1)ArrayBlockingQueue:

    ​ ArrayBlockingQueue 是一个用数组实现的、有界的阻塞队列,其内部实现是将对象放到一个数组里。有界也就意味着,它不能够存储无限多数量的元素。

    ​ 它有一个同一时间能够存储元素数量的上限。你可以在对其初始化的时候设定这个上限,但之后就无法对这个上限进行修改了(译者注:因为它是基于数组实现的,也就具有数组的特性:一旦初始化,大小就无法修改)。

    ​ 此队列按照FIFO(先进先出)的原则对元素进行排序;

    ​ 是一种默认情况下不保证访问者公平的访问队列;

    2)DelayQueue:

    ​ 这是一种支持延时获取元素的无界阻塞队列;

    ​ 意思就是,在往DelayQueue队列中存入元素时,可以指定:多久才能从队列中获取当前这些元素,即,延时获取;

    ​ 队列中的元素必须实现 java.util.concurrent.Delayed 接口。

    3)LinkedBlockingQueue:

    ​ 这是一种基于链表的阻塞队列;即,内部是以链表结构对其元素进行存储。

    ​ 与ArrayBlockingQueue类似,此队列也是按照FIFO(先进先出)的原则对元素进行排序;

    LinkedBlockingQueue可以高效的处理并发数据,因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着,在高并发的情况下,生产者和消费者可以并行的操作队列中的数据,这样一来大大的提高整个队列的并发性能;

    4)PriorityBlockingQueue:

    ​ 这是一种支持优先级的无界并发队列;

    ​ 无法向这个队列中插入 null 值。

    ​ 默认情况下元素采取自然顺序升序排列;

    ​ 所有插入到 该队列 的元素必须实现 java.lang.Comparable 接口,因此该队列中的元素的排序规则,也可以自定义。

    5)SynchronousQueue:

    ​ SynchronousQueue 是一个特殊的队列,它的内部同时只能够容纳单个元素。

    ​ 如果该队列已有一个元素的话,试图向队列中插入(Put)一个新元素的线程将会阻塞,直到另一个线程将该元素从队列中取走(take)。

    ​ 同样,如果该队列为空,试图向队列中抽取一个元素的线程将会阻塞,直到另一个线程向队列中插入了一条新的元素。

    展开全文
  • 主要介绍了剖析Java中阻塞队列的实现原理及应用场景,这里也对阻塞和非阻塞队列的不同之处进行了对比,需要的朋友可以参考下
  • 阻塞队列的实现原理 核心: lock锁+多条件(condition)的阻塞控制 Java中的阻塞队列使用BlockingQueue封装了根据condition条件阻塞线程的过程,使得我们不需要求关系繁琐的await和signal操作。 以生产消费者模式举例...

    阻塞队列的实现原理

    核心: lock锁+多条件(condition)的阻塞控制
    Java中的阻塞队列使用BlockingQueue封装了根据condition条件阻塞线程的过程,使得我们不需要求关系繁琐的await和signal操作。
    以生产消费者模式举例,使用阻塞队列可以不关系什么时候阻塞生产,什么时候阻塞消费。
    实现: 各个阻塞队列都实现了BlockingQueue接口


    常用阻塞队列:
    ArrayBlockingQueue:
    是一个用数组实现的、有界的阻塞队列,其内部实现是将对象放到一个数组里。有界也就意味着,它不能够存储无限多数量的元素。
    LinkedBlockingQueue:
    这是一种基于链表的阻塞队列;即,内部是以链表结构对其元素进行存储。
    SynchronousQueue:
    ​ SynchronousQueue 是一个特殊的队列,它的内部同时只能够容纳单个元素

    展开全文
  • 阻塞队列的实现原理 使用通知模式实现。 所谓通知模式,就是当生产者往满的队列里添加元素时会阻塞住生产者,当消费者消费了一个队列中的元素后,会通知生产者当前队列可用。通过查看JDK源码发现ArrayBlockingQueue...

    阻塞队列的实现原理

    使用通知模式实现。 所谓通知模式,就是当生产者往满的队列里添加元素时会阻塞住生产者,当消费者消费了一个队列中的元素后,会通知生产者当前队列可用。通过查看JDK源码发现ArrayBlockingQueue使用了Condition来实现,代码如下。

    在这里插入图片描述
    当往队列里插入一个元素时,如果队列不可用,那么阻塞生产者主要通过LockSupport.park(this)来实现。
    在这里插入图片描述
    继续进入源码,发现调用setBlocker先保存一下将要阻塞的线程,然后调用unsafe.park阻塞当前线程。

    在这里插入图片描述
    unsafe.park是个native方法,代码如下。
    在这里插入图片描述

    park这个方法会阻塞当前线程,只有以下4种情况中的一种发生时,该方法才会返回。

    • 与park对应的unpark执行或已经执行时。“已经执行”是指unpark先执行,然后再执行park的情况。
    • 线程被中断时。
    • 等待完time参数指定的毫秒数时。
    • 异常现象发生时,这个异常现象没有任何原因。

    继续看一下JVM是如何实现park方法:park在不同的操作系统中使用不同的方式实现,在Linux下使用的是系统方法pthread_cond_wait实现。实现代码在JVM源码路径src/os/linux/vm/os_linux.cpp里的os::PlatformEvent::park方法,代码如下。
    在这里插入图片描述
    pthread_cond_wait是一个多线程的条件变量函数,cond是condition的缩写,字面意思可以理解为线程在等待一个条件发生,这个条件是一个全局变量。这个方法接收两个参数:

    一个共享变量_cond,一个互斥量_mutex。

    而unpark方法在Linux下是使用pthread_cond_signal实现的。

    park方法在Windows下则是使用WaitForSingleObject实现的。想知道pthread_cond_wait是如何实现的,可以参考glibc-2.5的nptl/sysdeps/pthread/pthread_cond_wait.c。

    当线程被阻塞队列阻塞时,线程会进入WAITING(parking)状态。我们可以使用jstack dump阻塞的生产者线程看到这点,如下。

    在这里插入图片描述

    展开全文
  • 阻塞队列(BlockingQueue)是一个支持两个附加操作队列。这两个附加操作是:在队列为空时, 获取元素线程会等待队列变为非空。当队列满时,存储元素线程会等待队列可用。阻塞队列常用于 生产者和消费者...
  • 阻塞队列时如何实现阻塞?为什么它是线程安全
  • 阻塞队列(BlockingQueue)是一个支持两个附加操作队列,这两个附加操作支持阻塞插入和移除方法。 支持阻塞插入方法:当队列满时,队列会阻塞插入元素线程,直到队列不满。 支持阻塞移除方法:当...
  • 本篇我们将分析阻塞队列PriorityBlockingQueue实现原理,该阻塞队列每次取出都是最小对象,可以满足一定实际场景。  阻塞队列PriorityBlockingQueue从不阻塞写线程,而当队列元素为空时,会阻塞读线程读取...
  • 阻塞队列实现原理

    2020-03-05 21:35:26
    阻塞队列原理 java中ArrayBlockingQueue相信都用过,之前仅仅是使用没有了解其背后原理,知其然不知其所以然,这种学习方法是错误,上学时候老师总是告诉我们好记性不如烂笔头,相信如果自己手写一遍理解更...
  • 主要介绍了java阻塞队列实现原理及实例解析,文中通过示例代码介绍非常详细,对大家学习或者工作具有一定参考学习价值,需要朋友可以参考下
  • 阻塞队列的底层原理

    2019-12-10 10:53:52
      ArrayBlockingQueue是基于数组实现的有界的先进先出的阻塞队列,所以我们可以说队列的头部是队列中呆的时间最长的或者叫最早的,而队列的尾部则是刚刚呆的时间最短的,因为尾部的元素都是最新插入的。...
  • 1. 阻塞队列首先它是一个队列,是队列就会遵循先进先出(FIFO)原则,又因为它是阻塞,故与普通队列有两点区别: ...2. JUC中实现一个阻塞队列一般都会实现BlockingQueue接口,主要方法说明: ...
  • 主要介绍了详解Java阻塞队列(BlockingQueue)的实现原理阻塞队列是Java util.concurrent包下重要的数据结构,有兴趣的可以了解一下
  • 以ArrayBlockingQueue为例介绍等待通知实现阻塞队列的过程。 不会涉及到太多源码部分,意在对阻塞队列章节的全局概览进行总结,具体的每种具体实现,之后会一一分析学习。 什么是阻塞队列 阻塞队列 = 阻塞 + ...
  • 阻塞队列的原理

    2020-03-15 19:23:15
    一、什么是阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作队列。 这两个附加操作是:在队列为空时,...(1)ArrayBlockingQueue:一个由数组结构组成有界阻塞队列(数组结构可配合指针实现一个环形...
  • Java中的阻塞队列接口BlockingQueue继承自Queue接口。 BlockingQueue接口提供了3个添加元素方法: add:添加元素到队列里,添加成功返回true,由于容量满了添加失败会抛出IllegalStateException异常; ...
  • Java中的阻塞队列接口BlockingQueue继承自Queue接口。 BlockingQueue接口提供了3个添加元素方法: add:添加元素到队列里,添加成功返回true,由于容量满了添加失败会抛出IllegalStateException异常; offer:添加...
  • 阻塞队列 实现了BlockingQueue接口 阻塞队列常用于生产者和消费者场景,生产者是向队列里添加元素线程,消费者是从队列里取元素线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素容器。 ...
  • 背景:总结JUC下面的阻塞队列的实现,很方便写生产者消费者模式。 常用操作方法 常用的实现类 ArrayBlockingQueue DelayQueue LinkedBlockingQueue PriorityBlockingQueue SynchronousQueue 阻塞队列原理: ...
  • 阻塞队列的原理解析

    2021-02-03 13:31:15
    2、阻塞队列的使用案例 2.1 案例 注册成功后增加积分 假如我们模拟一个场景,就是用户注册的时候,在注册成功以后发放积分。这个场景在一般来说,我们会这么去实现: 但是实际上,我们需要考虑两个问题: 性能,在...
  • 文章目录ConcurrentHashMap对比HashMap和HashTableConcurrentHashMap结构原理get操作put操作size操作ConcurrentLinkedQueueConcurrentLinkedQueue结构原理入队列出队列阻塞队列BlockingQueueJava里六个阻塞...
  • 文章目录本篇要点什么是阻塞队列阻塞队列提供的方法阻塞队列的七种实现TransferQueue和BlockingQueue的区别1、ArrayBlockingQueue2、...LinkedTransferQueue7、LinkedBlockingDeque阻塞队列的实现机制put方法take方法参考阅读...
  • 1. 简介 阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞...并发包下很多高级同步类的实现都是基于BlockingQueue实现的。 2. 操作方法 ...
  • 其实阻塞队列实现阻塞同步方式很简单,使用就是: lock + 多个条件(condition)阻塞控制。 使用BlockingQueue封装了根据条件阻塞线程过程,而我们就不用关心繁琐await/signal操作了。 下面是Jdk 1.7中...
  • Queue的实现 阻塞的意思是如果队满加入或者对空输出都是需要需要等待 而非阻塞的并不用。 一.Queue的实现 1.没有实现阻塞接口的: (1)LinkedList : 实际是双向链表 实现了 Deque 接口最实用(也是一个最常用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 988
精华内容 395
关键字:

阻塞队列的实现原理