返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java7种常见队列
  • 615
分享到

Java7种常见队列

数据结构java 2023-10-02 07:10:58 615人浏览 安东尼
摘要

LinkedBlockingQueue 特点 线程安全:多个线程同时访问队列时不会出现数据错乱 阻塞队列:队列已满时,插入操作会被阻塞等待;队列为空时,取出操作会被阻塞等待 无界队列:如果不指定容量大

LinkedBlockingQueue
特点

线程安全:多个线程同时访问队列时不会出现数据错乱

阻塞队列:队列已满时,插入操作会被阻塞等待;队列为空时,取出操作会被阻塞等待

无界队列:如果不指定容量大小,就是一个无界队列,可以一直添加元素

可以实现生产者消费者模型:多个生产者线程可以往队列中添加元素,多个消费者线程可以从队列中取出元素,可以实现生产者消费模型

底层

使用链表实现的无界队列。其内部有一个头节点和一个尾节点,在插入和删除元素时会对头尾节点进行操作。具体来说,插入元素的操作会将新元素添加到尾节点的后面,并修改尾结点指向;删除元素的操作会从头结点的后一个位置开始删除,并修改头节点指向。由于是链表实现的,LinkedBlockingQueue理论上可以容纳无限数量的元素。
使用和条件变量来实现线程间的同步。当队列满时,插入操作会被阻塞并进入等待队列。只有当另一个线程往队列中插入了一个元素时,阻塞的插入操作线程才会被唤醒,继续执行操作;同理当另一个线程从队列中取出了一个元素时,阻塞的取出的操作线程才会被唤醒,继续执行。

ArrayBlockingQueue
特点

固定大小:在创建时需要指定队列的容量,之后队列的大小就不能再进行扩展了

阻塞操作:当队列已满时,后续插入操作会被阻塞,直到队列中有空间可以放置元素。同样地,当队列为空时,后序的取出操作也会被阻塞,直到队列中有可用的元素。

线程安全:多个线程可以同时对队列进行读写操作,而不会引发静态条件等线程安全问题

底层

使用数组实现的有界队列,数组中保存队列元素的值。它同时使用了一个锁和两个条件变量来实现线程之间的同步。当队列满时,插入操作会阻塞并进入等待队列;当队列为空时,取出操作会阻塞并进入等待队列。只有当另一个线程从队列中去除了一个元素时,阻塞的线程才会被唤醒,继续执行操作。这样可以避免忙等待带来的CPU资源浪费,提高了效率

SynchronousQueue
特点

大小为0:容量为0,即它不会保存任何元素

阻塞操作:没有任何元素时,插入和取出操作都会被阻塞,直到另外一个线程来执行相应的取出或插入操作

零容错:如果没有其它线程等待并准备好进行各自需要的操作,则插入操作的返回值为false,取出操作则返回null

底层

通过一种称为"transfer"机制来实现线程间同步的,这种机制可以让两个线程直接交换元素。在插入或删除元素时,如果队列为空,则将当前线程加入等待队列中,并挂起该线程;如果队列不为空,则从等待队列中选择一个线程(通常是等待时间最长的)进行交换。
其中,每个等待操作都会创建一个节点,节点之间形成一个链表结构。当产生匹配的插入和删除操作时,相应的等待操作的节点会被唤醒,并被连接到执行操作的节点上,以完成数据提交和接受。

需要注意的是SynchronousQueue的插入和删除操作是成对出现的,在这两个操作中至少由一个操作完成前,线程会一直阻塞等待。同时,SynchronousQueue没有任何容量限制,只要还有线程在尝试往队列中添加元素,它就无限制地正常

PriorityBlockingQueue
特点
1.有序性:保证了每次取出的元素都是当前队列中优先级最高的元素

阻塞操作:当队列为空时,取出操作会被阻塞,直到队列不再为空;当队列已满时,插入操作也会被阻塞,直到队列可以容纳插入元素

线程安全:内部使用了锁和条件变量来实现线程间同步,可以被多个线程同时访问而不会发生数据竞争或者其他线程安全问题。

需要对每个元素定义一个优先级,,这个优先级可以通过Coparator来进行定义,在默认情况下元素会按照其自然次序进行排序(例如数字按升序排列,字符串按字典序排列等)。每次插入操作都会将新元素插入到合适的位置,并重新调整队列中元素的顺序可以维护有序性,因此相比于普通队列,它具有更高的开销

底层

是基于一个堆数据结构实现的,堆是一种具有有序特性的树形数据结构。堆被用来维护队列的有序性,并确保每次去除元素都是当前优先级最高的元素。
使用ReentrantLock来保证线程安全,并使用Condition来实现阻塞操作。在添加元素时,如果队列已满,则插入操作会阻塞,并等待其他线程取出元素以空出空间。在删除元素时,如果队列为空,则删除操作会阻塞,并等待其他线程王队列中添加元素。

核心方法是siftUp和siftDown,这两个方法用来调用整堆的结构以满足有序性。在插入元素时,新元素被加到堆的底部,然后通过siftUp方法向上调整位置,直到达到合适位置位置;在取出元素时,堆顶元素被删除并返回,然后将堆底部的元素放到堆顶位置,再通过sifDown方向向下调整位置,直到达到合适位置位置。这样就实现了有序性,而且操作效率高

DelayQueue
特性
1.有序性:是一个有序队列,其中元素根据其到期时间进行排序,从而保证了每次去除的元素都是已经到期的元素

延迟操作:可以实现延迟操作,即元素插入到队列中时可以指定一个过期时间,在这个时间之前元素不可取出,只能被保存在队列中等待到期

线程安全:内部使用了锁和条件变量来实现线程间同步,可以被多个线程同时访问而不会发生数据竞争或其他线程安全问题

在使用DelayQueue时,需要为每个元素定义一个过期时间,在插入元素时,DelayQueue会根据过期时间对元素进行排序,并按照优先级从小到大依次放入队列中。当使用take方法获取队头元素时,如果此时队头元素尚未到期,则take方法会被阻塞知道元素到期;如果队列为空,则take方法也会被阻塞,知道队列中有新的元素插入。

适合实现任务调度和超时控制功能。我们可以将需要延迟执行的任务封装成Delayed对象,并将其插入到队列中,在使用take方法获取队头元素时,如果此时队头元素已经到期,则可以取出该任务执行;否则重新放回队列中等待下次执行。通过这种方法,我们可以实现非常精确的任务调度和超时控制功能,使得程序的运行更加严谨和可靠

底层

是基于一个PriorityQueue和一个等待队列(WaitQueue)实现的

LinkedTransferQueue
特点

支持高并发:采用无锁算法、分离锁等方式来实现高效的并发操作支持。另外该队列还是用了一些辅助线程进行帮助性操作,如在添加元素时动态创建内部节点以优化性能

双向通道:相比于普通的阻塞队列,它不仅支持传统的put、task等操作,还提供了Transfer方法,该方法可以实现一个双向通道,可以在两个线程之间直接进行数据传输。其中,Transfer方法将阻塞当前线程,直到有其他线程调用了对应的receive方法才会唤醒,保证了数据的及时传输

无界队列:基于链表实现的是一个无界队列,可以在队列中持续添加元素而不必担心队列满的情况

公平性:使用公平锁来保证线程获取元素的顺序与插入元素的顺序一致

总结:它是一种高性能且灵活的队列类型,可以在多个线程之间快速通信。它结合了传统的生产者-消费者模型和直接传递模式,使得线程间的数据传输更加便捷和高效,并且支持公平性和无锁算法等特性,使得高并发环境中也能够保证其稳定性和可靠性。

底层

是基于一个链表实现的,其中每个结点都定义了一个等待列表,用于保存等待接受的线程

LinkedBlockingDeque
特点

双向队列:支持从队列的两端添加和删除元素,因此可以有效地满足更多种类的应用长青。除了普通队列的FIFO放室外,还可以以LIFO方式或以先进先出优先级方式来消费队列中的元素

阻塞式等待:知识put和take等方法,这些方法在执行时如果遇到空队列或满队列则会将当前线程阻塞并等待新的元素加入或释放出相关元素,从而保证了线程之间的协作和同步性

无界队列:理论上可以容纳无限数量的元素,因此可以处理大量数据甚至无线扩展

线程安全:内部自带锁以及条件变量进行同步机制控制,能够保证线程之间的安全访问

适合消费生产模型:当生产者线程已经塞满了队列之后,可以等待消费者线程进行消费,这种特性能够实现多生产者和多消费者模具下的特别优异表现。

总结:它是一种高效、安全且灵活的队列结构,兼具各种队列的特性,并通过阻塞式等待模型来解决县城之间的协作与同步问题。它被广泛应用于需要高效处理大量数据的场景中,并且很适合消费生产模型下的并发编程

底层

基于一个双向链表实现的,其中每个结点都定义了prev和next两个指针,用于连接前一个后一个结点。

来源地址:https://blog.csdn.net/cstjzr/article/details/130586289

--结束END--

本文标题: Java7种常见队列

本文链接: https://lsjlt.com/news/422531.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java7种常见队列
    LinkedBlockingQueue 特点 线程安全:多个线程同时访问队列时不会出现数据错乱 阻塞队列:队列已满时,插入操作会被阻塞等待;队列为空时,取出操作会被阻塞等待 无界队列:如果不指定容量大...
    99+
    2023-10-02
    数据结构 java
  • Java常见的阻塞队列总结
    Java阻塞队列 阻塞队列和普通队列主要区别在阻塞二字: 阻塞添加:队列已满时,添加元素线程会阻塞,直到队列不满时才唤醒线程执行添加操作 阻塞删除:队列元素为空时,...
    99+
    2024-04-02
  • 常见的消息队列有哪些区别
    这篇文章主要讲解了“常见的消息队列有哪些区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“常见的消息队列有哪些区别”吧!一、消息队列由来可能在你没了解消息队...
    99+
    2024-04-02
  • Java RabbitMQ消息队列详解常见问题
    目录消息堆积保证消息不丢失死信队列延迟队列RabbitMQ消息幂等问题RabbitMQ消息自动重试机制合理的选择重试机制消费者开启手动ack模式rabbitMQ如何解决消息幂等问题R...
    99+
    2024-04-02
  • golang 几种消息队列
    Golang作为一门快速发展的编程语言,越来越受到开发者的青睐。而在现代的基于云计算、分布式、异构系统的开发中,消息队列成为了一种非常重要的架构组件。本文将介绍几种Golang常用的消息队列,并简单对比它们的特点和适用场景。1. Kafka...
    99+
    2023-05-15
  • pandas添加新列的5种常见方法
    目录前言一、insert()函数二、直接赋值法三、reindex()函数四、concat()函数五、loc()函数附:pandas根据现有列新添加一列总结前言 pandas...
    99+
    2024-04-02
  • Python 常见异常列表
    常见Python异常异常描述AssertionErrorassert(断言)语句失败AttributeError试图访问一个对象没有的属性,比如foo.x ,但是foo没有x这个属性。IOError输入/输出异常,基本上是无法打开文件。Im...
    99+
    2023-01-31
    异常 常见 列表
  • python列表去重的5种常见方法实例
    目录前言一、使用for循环实现列表去重二、使用列表推导式去重三、使用集合转换函数set()实现列表去重四、使用新建字典方式实现列表去重五、删除列表中存在重复的数据附:Python 二...
    99+
    2024-04-02
  • java常见的几种异常
    异常,根据字面理解,有意外之意。把它置于代码层面来理解,即阻止了当前方法或作用域继续执行。在Java中,异常被当做对象来处理,其基类是Throwable。java常见的几种异常:1、空指针异常类:NullPointerException调用...
    99+
    2022-04-17
    java基础 java 异常
  • 常见的几种排序
    快速排序      从数列中挑出一个元素,称为 “基准”(pivot),重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面...
    99+
    2024-04-02
  • WCF消息队列的类型有几种
    这篇文章主要介绍WCF消息队列的类型有几种,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!WCF经过长时间的发展,很多用户都很了解WCF了,这里我发表一下个人理解,和大家讨论讨论。WCF消息队列Message是由通信的...
    99+
    2023-06-17
  • oracle常见的几种数据类型 Oracle 10g学习系列(3)
    oracle常见的几种数据类型: char的长度是固定的,最大长度为2K字节。比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空...
    99+
    2024-04-02
  • Java中ReentrantLock4种常见的坑
    目录前言Lock 简介ReentrantLock 使用ReentrantLock 中的坑1.ReentrantLock 默认为非公平锁2.在 finally 中释放锁3.锁不能被释放...
    99+
    2024-04-02
  • 消息队列-kafka消费异常问题
    目录概述重试一定次数(消息丢失)加入到死讯队列(消息不丢失)总结概述 在kafka中,或者是说在任何消息队列中都有个消费顺序的问题。为了保证一个队列顺序消费,当当中一个消息消费异常时...
    99+
    2024-04-02
  • Python常用队列全面详细梳理
    目录一,队列二,常见队列1,FIFO队列2,LIFO队列3,双向队列4,优先级队列5,循环队列一,队列 和栈一样,队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)...
    99+
    2023-01-28
    Python常用队列 Python队列
  • Python中列表list常见操作
    主要涉及知识点列表是我们python里面最常见的数据类型,我们主要有以下的操作。1、索引2、切片3、追加4、删除5、长度6、循环 (也称遍历)7、包含8、嵌套例如定义列表:List2=['openstack','python','linux...
    99+
    2023-01-31
    常见 操作 列表
  • Springboot+rabbitmq实现延时队列的两种方式
    目录什么是延时队列,延时队列应用于什么场景利用TTL DLX实现延时队列的方式TTL DLX是什么Springboot集成rabbitmq实现第一种方式利用Rabbitmq的插件x-...
    99+
    2024-04-02
  • RabbitMQ 的七种队列模式和应用场景
    目录七种模式介绍与应用场景 简单模式(Hello World)工作队列模式(Work queues)订阅模式(Publish/Subscribe)路由模式(Routing)...
    99+
    2024-04-02
  • Java多线程之多种锁和阻塞队列
    目录一、悲观锁和乐观锁1.1. 乐观锁1.2. 悲观锁二、公平锁和非公平锁三、可重入锁(递归锁)四、自旋锁五、独占锁(写)/共享锁(读)六、什么是阻塞队列?七、阻塞队列(Blocki...
    99+
    2024-04-02
  • Kafka中消息队列的两种模式讲解
    目录Kafka消息队列的两种模式1、点对点模式 2、发布/订阅模式 Kafka消息队列模型图解Kafka消息队列的两种模式 消息队列包括两种模式,点对点模式(po...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作