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

为什么ArrayBlockingQueue被称为有界队列而LinkedBlockingQueue被称为无界阻塞队列?

在Java并发编程中,队列是一种常用的数据结构,用于在多线程环境中安全地传输数据。ArrayBlockingQueue和LinkedBlockingQueue是Java并发包中的两种常用队列,它们都是BlockingQueue接口的实现。

ArrayBlockingQueue是一个有界队列,它的容量是固定的,在创建队列时需要指定队列的大小。这意味着队列中的元素数量永远不会超过队列的容量。当队列已满时,尝试将元素添加到队列中的操作将被阻塞,直到队列中有空间可用。

LinkedBlockingQueue是一个无界阻塞队列,它的容量是动态的,可以存储任意数量的元素。当队列中的元素数量达到Integer.MAX_VALUE时,队列将达到其最大容量。由于队列的容量是动态的,因此它可以根据需要自动扩展。当队列已满时,尝试将元素添加到队列中的操作将被阻塞,直到队列中有空间可用。

总结一下,ArrayBlockingQueue被称为有界队列,因为它的容量是固定的,而LinkedBlockingQueue被称为无界阻塞队列,因为它的容量是动态的,可以存储任意数量的元素。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

一、 前言 上节介绍了无界链表方式的阻塞队列LinkedBlockingQueue,本节来研究下有界使用数组方式实现的阻塞队列ArrayBlockingQueue 二、 ArrayBlockingQueue...另外构造函数必须传入队列大小参数,所以为有界队列,默认是Lock为非公平锁。...x; } 六、take操作 从队头获取元素,如果队列为空则阻塞直到队列有元素。...其中offer,poll操作通过简单的加锁进行入队出队操作,put,take则使用了条件变量实现如果队列满则等待,如果队列空则等待,然后分别在出队和入队操作中发送信号激活等待线程实现同步。...另外相比LinkedBlockingQueueArrayBlockingQueue的size操作的结果是精确的,因为计算前加了全局锁。

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

    一、前言 前面介绍了使用CAS实现的非阻塞队列ConcurrentLinkedQueue,下面就来介绍下使用独占锁实现的阻塞队列LinkedBlockingQueue的实现 二、 LinkedBlockingQueue...12.2简单对比 LinkedBlockingQueue与ConcurrentLinkedQueue相比前者前者是阻塞队列使用可重入独占的非公平锁来实现通过使用put锁和take锁使得入队和出队解耦可以同时进行处理...ConcurrentLinkedQueue则使用CAS非阻塞算法来实现,使用CAS原子操作保证链表构建的安全性,当多个线程并发时候CAS失败的线程不会被阻塞,而是使用cpu资源去轮询CAS直到成功,size...方法先比LinkedBlockingQueue的获取的个数是不精确的,因为获取size的时候是通过遍历队列进行的,遍历过程中可能进行增加删除操作,remove方法操作时候也没有对整个队列加锁,remove...时候可能进行增加删除操作,这就可能删除了一个刚刚新增的元素,不是删除的想要位置的。

    77930

    基于数组的有界阻塞队列 —— ArrayBlockingQueue

    " 1 介绍 由数组支持的有界BlockingQueue阻塞队列。 这个队列的命令元素FIFO(先入先出)。队列的头是元素一直在队列中时间最长。队列的尾部是该元素已经在队列中的时间最短。...新元素插入到队列的尾部,并且队列检索操作获取在队列的头部元素。 这是一个典型的“有界缓冲区”,在其中一个固定大小的数组保持由生产者插入并受到消费者的提取的元素。一旦创建,容量不能改变。...试图put 一个元素到一个满的队列将导致操作阻塞; 试图 take 从空队列一个元素将类似地阻塞。 此类支持订购等待生产者和消费者线程可选的公平政策。默认情况下,这个顺序不能保证。...,二者不同的是,当队列中没有元素时,poll 方法返回 null, take 方法会一直阻塞等待,直到从队列中获取到元素。...A: 方法 作用 add 添加元素,队列满了,添加失败抛出异常 offer 添加元素, 队列满了,添加失败,返回 false put 添加元素,队列满了,阻塞等待 poll 弹出元素,队列为空则返回

    90620

    【面试题精讲】ArrayBlockingQueueLinkedBlockingQueue 有什么区别?

    LinkedBlockingQueue:是一个基于链表实现的可选有界无界阻塞队列,它也按照先进先出(FIFO)的原则对元素进行排序。 2....为什么需要ArrayBlockingQueueLinkedBlockingQueue? 在多线程编程中,我们经常需要使用队列来实现线程间的数据共享。...支持有界队列,可以限制队列的大小。 LinkedBlockingQueue: 内部使用链表实现,插入和删除性能较高。 支持可选的有界无界队列。 6....当队列为空时,获取操作会被阻塞LinkedBlockingQueue: 可以选择有界无界队列。 当队列已满时(对于有界队列),添加操作会被阻塞。 当队列为空时,获取操作会被阻塞。 8....ArrayBlockingQueue适合读写性能较高、固定容量的场景;LinkedBlockingQueue适合插入和删除性能较高、可选有界无界的场景。在使用时需要根据具体需求选择合适的队列实现。

    16820

    JDK并发编程类库,有坑!!!

    阻塞队列一个明显的标识就是使用Blocking修饰,例如,ArrayBlockingQueueLinkedBlockingQueue都是阻塞队列。...单端阻塞队列 在Java的并发容器中,单端阻塞队列的主要实现是BlockingQueue,主要包括:ArrayBlockingQueueLinkedBlockingQueue、SynchronousQueue...单端阻塞队列的内部一般会有一个队列。 在实现上,内部的队列可以是数组,例如ArrayBlockingQueue,也可以是链表,例如LinkedBlockingQueue。...有界无界队列 使用队列时,还要注意队列有界无界问题,也就是在使用队列时,需要注意队列是否有容量限制。 在实际工作中,一般推荐使用有界队列。因为无界队列很容易导致内存溢出的问题。...在Java的并发容器中,只有ArrayBlockingQueueLinkedBlockingQueue支持有界,其他的队列都是无界队列。 在使用时,一定要注意内存溢出问题。

    9310

    并发编程踩坑实录二:并发容器踩坑总结!!

    阻塞队列一个明显的标识就是使用Blocking修饰,例如,ArrayBlockingQueueLinkedBlockingQueue都是阻塞队列。...单端阻塞队列 在Java的并发容器中,单端阻塞队列的主要实现是BlockingQueue,主要包括:ArrayBlockingQueueLinkedBlockingQueue、SynchronousQueue...单端阻塞队列的内部一般会有一个队列。 在实现上,内部的队列可以是数组,例如ArrayBlockingQueue,也可以是链表,例如LinkedBlockingQueue。...有界无界队列 使用队列时,还要注意队列有界无界问题,也就是在使用队列时,需要注意队列是否有容量限制。 在实际工作中,一般推荐使用有界队列。因为无界队列很容易导致内存溢出的问题。...在Java的并发容器中,只有ArrayBlockingQueueLinkedBlockingQueue支持有界,其他的队列都是无界队列。 在使用时,一定要注意内存溢出问题。

    42210

    Java中常用的七个阻塞队列介绍第一篇

    阻塞队列的七个子类: ArrayBlockingQueue(下文简称:ABQueue)、LinkedBlockingQueue(下文简称:LBQueue)、PriorityBlockingQueue(下文简称...所以通过源码分析我们可以对ABQueue得到如下总结: ABQueue结论: ArrayBlockingQueue:是数据结构的有界阻塞队列。且默认使用非公平锁,也就是不保证线程公平访问队列的。...为什么说是有界的呢?因为我们知道数组大小是有边界的。无论你声明的数组多大,最后都一个极限的。存在大小限制,从源码中,来看看向队列中添加数据的方法: 为什么说默认不保证线程公平呢?...所以,从源码中,我们可以得到如下总结: LBQueue结论: LBQueue是使用链表结构的有界阻塞队列为什么说是有界的呢?我们来看看添加的元素的源码: 需要注意:千万别用默认的。...PriorityBlockingQueue 无界的 链表 "支持优先级的阻塞队列

    50020

    Java多线程系列--阻塞队列BlockingQueue的用法

    LinkedBlockingQueue 基于链表的FIFO队列;有/无界;默认大小是 Integer.MAX_VALUE(无界),可自定义(有界); 两个重入锁分别控制元素的入队和出队,用Condition...如果队列己满:阻塞当前线程,直到队列有空闲插入成功后返回。 如果在阻塞时被其他线程设置了中断标志:被阻塞线程会抛出InterruptedException异常返回。...如果队列为空则阻塞当前线程直到队列不为空然后返回元素; 如果在阻塞时被其他线程设置了中断标志,则被阻塞线程会抛出InterruptedException异常返回。...size() 获得队列中有多少值(返回AtomicLong的值) ArrayBlockingQueue 简介 ArrayBlockingQueue通过数组实现的FIFO有界阻塞队列,它的大小在实例被初始化的时候就被固定了...ArrayBlockingQueue有界队列: 任务1和2在核心线程中执行; 任务3和4进来时,放到ArrayBlockingQueue缓存队列中,并且只能放2个(ArrayBlockingQueue

    48330

    奉劝那些刚参加工作的学弟学妹们:要想学好并发编程,这些并发容器的坑是你必须要注意的!!(建议收藏)「建议收藏」

    阻塞队列一个明显的标识就是使用Blocking修饰,例如,ArrayBlockingQueueLinkedBlockingQueue都是阻塞队列。...单端阻塞队列 在Java的并发容器中,单端阻塞队列的主要实现是BlockingQueue,主要包括:ArrayBlockingQueueLinkedBlockingQueue、SynchronousQueue...单端阻塞队列的内部一般会有一个队列。 在实现上,内部的队列可以是数组,例如ArrayBlockingQueue,也可以是链表,例如LinkedBlockingQueue。...有界无界队列 使用队列时,还要注意队列有界无界问题,也就是在使用队列时,需要注意队列是否有容量限制。 在实际工作中,一般推荐使用有界队列。因为无界队列很容易导致内存溢出的问题。...在Java的并发容器中,只有ArrayBlockingQueueLinkedBlockingQueue支持有界,其他的队列都是无界队列。 在使用时,一定要注意内存溢出问题。

    60330

    ArrayBlockingQueueLinkedBlockingQueue

    对比 queue 阻塞与否 是否有界 线程安全保障 适用场景 注意事项 ArrayBlockingQueue 阻塞 有界 一把全局锁 生产消费模型,平衡两边处理速度 用于存储队列元素的存储空间是预先分配的...,使用过程中内存开销较小(无须动态申请存储空间) LinkedBlockingQueue 阻塞 可配置 存取采用2把锁 生产消费模型,平衡两边处理速度 无界的时候注意内存溢出问题,用于存储队列元素的存储空间是在其使用过程中动态分配的...ConcurrentLinkedQueue 非阻塞 无界 CAS 对全局的集合进行操作的场景 size() 是要遍历一遍集合,慎用 内存方面 ArrayBlockingQueue 用于存储队列元素的存储空间是预先分配的...有界无界 ArrayBlockingQueue 有界,适合已知最大存储容量的场景 LinkedBlockingQueue有界可以无界 吞吐量 LinkedBlockingQueue在大多数并发的场景下吞吐量比...这个主要针对LinkedBlockingQueue无界的场景来说,由于无界,所以offer以及poll的吞吐量通常比ArrayBlockingQueue高。

    1.4K20

    读书笔记《Java并发编程的艺术 - 方腾飞》- 7种阻塞队列

    , offer(e,time) put , poll(time) take() 我也来说一说Java的7个阻塞队列 有界: 在创建队列时必须或允许指定队列大小, 允许调用抛出异常的 add 方法 无界...ArrayBlockingQueue[有界] 一个使用数组实现的有界阻塞队列....ArrayBlockingQueue[有界]) 相同 总结: 结论不指定队列大小, 默认值为 int 最大值 吞吐量要比ArrayBlockingQueue高 链表有界队列 不可加入公平策略 插入时提供了可抛出异常操作...总结: 创建时无需指定队列大小, 且无最大值即无阻塞插入知道内存溢出 吞吐量要比LinkedBlockingQueue高 链表无界队列 在调用队列元素被阻塞时, 提供了可以将入队元素直接返回的 transfer...poll 方法返回null take 方法将被阻塞 同步执行入队和出队即可, 这也是为什么队列是吞吐量最高的队列原因 总结: 没有容量 吞吐量要比ArrayBlockingQueueLinkedBlockingQueue

    75950

    用Java如何设计一个阻塞队列,然后说说ArrayBlockingQueueLinkedBlockingQueue

    首先我们先来归纳一下,Java中有哪些已经实现好了的阻塞队列队列 描述 ArrayBlockingQueue 基于数组结构实现的一个有界阻塞队列 LinkedBlockingQueue 基于链表结构实现的一个有界阻塞队列...PriorityBlockingQueue 支持按优先级排序的无界阻塞队列 DelayQueue 基于优先级队列(PriorityBlockingQueue)实现的无界阻塞队列 SynchronousQueue...不存储元素的阻塞队列 LinkedTransferQueue 基于链表结构实现的一个无界阻塞队列 LinkedBlockingDeque 基于链表结构实现的一个双端阻塞队列 我们这次主要来看一下ArrayBlockingQueue...,offer则不是阻塞入队,入队列成功即返回true否则返回false。...ArrayBlockingQueueLinkedBlockingQueue都是有界阻塞队列LinkedBlockingQueue的默认长度为Int的最大值也暂且归为是有界),ArrayBlockingQueue

    1.5K10

    【小家java】BlockingQueue阻塞队列详解以及5大实现(ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue...)

    认识BlockingQueue 为什么说是阻塞(Blocking)的呢?...阻塞队列:顾名思义,首先它是一个队列一个队列在数据结构中所起的作用大致如下图所示: ?...ArrayBlockingQueueLinkedBlockingQueue是两个最普通也是最常用的阻塞队列,一般情况下,在处理多线程间的生产者消费者问题,使用这两个类足以。...DelayQueue是一个没有大小限制的队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞只有获取数据的操作(消费者)才会被阻塞。...LinkedBlockingQueue 底层是链表,可以当做无界有界队列来使用,所以大家不要以为它就是无界队列。 DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。

    1.2K20

    并发编程之BlockingQueue

    队列容器已满,生产者线程会被阻塞,直到队列未满;当队列容器为空时,消费者线程会被阻塞,直至队列非空时为止。...BlockingQueue类图 ArrayBlockingQueue ArrayBlockingQueue 是 BlockingQueue 接口的有界队列实现类,底层采用数组来实现。...ArrayBlockingQueue 原理 LinkedBlockingQueue LinkedBlockingQueue 底层基于单向链表实现的阻塞队列,可以当做无界队列也可以当做有界队列来使用,同样满足...FIFO 的特性,与 ArrayBlockingQueue 相比起来具有更高的吞吐量,为了防止 LinkedBlockingQueue 容量迅速增,损耗大量内存。...LinkedBlockingQueue原理 PriorityBlockingQueue PriorityBlockingQueue 是一个支持优先级的无界阻塞队列

    51330
    领券