返回顶部
首页 > 资讯 > 精选 >ArrayBlockQueue函数及应用场景是什么
  • 236
分享到

ArrayBlockQueue函数及应用场景是什么

2023-07-05 19:07:14 236人浏览 安东尼
摘要

今天小编给大家分享一下ArrayBlockQueue函数及应用场景是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。队列在

今天小编给大家分享一下ArrayBlockQueue函数及应用场景是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    队列在生活中随处可见,医院缴费需要排队、做核酸需要排队、汽车等红绿灯需要排队等等。

    ArrayBlockQueue函数及应用场景是什么

    队列是一个按照先来到就排在前面,后来到排在后面的数据结构,并且出队的时候也是按照先来到先出队。使用数组链表进行实现。通常用于协调任务的执行和数据的交换。

    介绍

    ArrayBlockingQueue 是一个有界阻塞队列,有界指的是队列存在一个最大容量;阻塞指的是如果队列已经满了,想要往队列继续添加元素的话,那么这个操作将会被暂停,直到队列中有空位才会继续完成添加操作。如果队列已经为空,想要从队列中获取元素,那么这个操作将会被暂停,直接队列中存在元素才会继续完成获取操作。

    它具有线程安全、性能好、公平选项的特点:

    • 线程安全:使用锁和条件变量实现线程安全,无需额外的同步措施。

    • 阻塞操作:当队列满时,插入操作阻塞;当队列空时,删除操作阻塞。这有助于避免忙等待和减少无意义的资源消耗。

    • 公平锁选项:支持是否使用公平锁。避免锁饥饿。

    • 高性能:基于数组实现,内存连续分配,访问性能较高。

    但是同时也存在不灵活、无法支撑高并发的缺点

    • 有界性:队列的容量固定,不可动态改变。因此在创建时分配多大容量将成为关键,分配过多会造成资源浪费,分配过少会造成竞争激烈。

    • 锁竞争:在高并发情况下,锁竞争可能会导致性能下降。

    实现原理

    ArrayBlockingQueue 内部使用数组作为元素的存储结构。

    执行存取操作时,都必须先获取锁,才可以执行存取操作,这就保证ArrayBlockingQueue 是线程安全。

    ArrayBlockingQueue 通过两个 Condition 条件队列,一个 notFull 条件,一个 notEmpty 条件。在对队列进行插入元素操作时,判断当前队列已经满,则通过 notFull 条件将线程阻塞,直到其他线程通知该线程队列可以继续插入元素。在对队列进行移除元素操作时,判断当前队列已经空,则通过 notEmpty 条件阻塞线程,直到其他线程通过该线程可以继续获取元素。

    这样保证线程的存取操作不会出现错误。避免队列在满时,丢弃插入的元素;也避免在队列空时取到一个 null 值。

    构造函数

    public ArrayBlockingQueue(int capacity, boolean fair) {    if (capacity <= 0)        throw new IllegalArgumentException();    this.items = new Object[capacity];    lock = new ReentrantLock(fair);    notEmpty = lock.newCondition();    notFull =  lock.newCondition();}

    构造函数中,需要指定队列的容量和是否使用公平锁。并且创建了两个 Condition 条件队列,分别命名为 notEmpty 和 notFull,这两个条件队列是实现阻塞的关键。

    通过构造函数我们可以知道为什么它叫有界:因为创建数组时,需要指定数组的容量,并且数组容量不能在运行中动态扩大。所以队列的容量是有边界的,不是无限扩张的。

    插入函数

    public void put(E e) throws InterruptedException {    Objects.requireNonNull(e);    final ReentrantLock lock = this.lock;    lock.lockInterruptibly();    try {        while (count == items.length)            notFull.await();        enqueue(e);    } finally {        lock.unlock();    }}
    • 获取锁

    • 判断当前队列是否已经满了

    • 如果队列1已经满了,调用 notFull 条件队列的 await() 方法,将该线程阻塞,暂停该线程的插入操作。避免内部溢出的问题。

    • 如果没有满,则直接调用入队函数 enqueue 插入到队列末尾。

    • 解锁

    ArrayBlockQueue函数及应用场景是什么

    获取函数

    public E take() throws InterruptedException {    final ReentrantLock lock = this.lock;    lock.lockInterruptibly();    try {        while (count == 0)            notEmpty.await();        return dequeue();    } finally {        lock.unlock();    }}
    • 获取锁

    • 判断当前队列是否为空

    • 如果队列没有元素,调用 notEmpty 条件队列的 await() 方法,将该线程阻塞,暂停该线程的获取操作。避免获取元素出错。

    • 如果不为空,则直接调用出队函数 dequeue 移除队列第一个元素,并返回给客户端。

    • 释放锁

    ArrayBlockQueue函数及应用场景是什么

    入队函数

    private void enqueue(E e) {    final Object[] items = this.items;    items[putIndex] = e;    if (++putIndex == items.length) putIndex = 0;    count++;    notEmpty.signal();}

    将元素插入到队列的尾部,在完成插入操作之后会调用 notEmpty 对象的 signal 方法,告诉 notEmpty 阻塞队列,现在队列中已经有元素,之前因为队列没有元素而被阻塞的线程,现在可以来获取元素了。

    ArrayBlockQueue函数及应用场景是什么

    内部维护一个 putIndex,用于表示下一个将要插入元素的坐标。当 putIndex 等于数组长度时,将会重置为 0。putIndex 是一个从 0 - length 循环使用的坐标。

    维护一个 count 变量,用于表示队列中存在多少元素,在存入的时候增加,在取出的时候减少。

    ArrayBlockQueue函数及应用场景是什么

    出队函数

    private E dequeue() {    final Object[] items = this.items;    @SuppressWarnings("unchecked")    E e = (E) items[takeIndex];    items[takeIndex] = null;    if (++takeIndex == items.length) takeIndex = 0;    count--;    if (itrs != null)        itrs.elementDequeued();    notFull.signal();    return e;}

    将队列的第一个元素移除,并返回给客户端。在完成移除操作之后会调用 notFull 对象的 signal 方法,告诉 notFull 阻塞队列,现在队列中已经有空位了,之前因为队列没有空位而被阻塞的线程,现在可以继续插入元素。

    ArrayBlockQueue函数及应用场景是什么

    内部维护一个 takeIndex,用于表示下一个可以获取元素的坐标。当 takeIndex 等于数组长度时,将会重置为 0。takeIndex 是一个从 0 至数组长度之间循环使用的坐标。

    ArrayBlockQueue函数及应用场景是什么

    应用场景

    适用场景

    ArrayBlockingQueue 适用于多个线程之间需要共享数据、协调任务执行的场景。因此可以总结出以下几个应用场景:

    • 线程池:线程池是一个常见的并发编程模型,它通过线程池中的线程执行任务。并且可以重复使用这些线程。在线程池中,可以使用 ArrayBlockingQueue 来存储需要执行的任务,以此控制任务数量和执行顺序。当线程池中的线程执行完任务之后,可以从 ArrayBlockingQueue 中取出下一个任务执行。

    • 生产者-消费者:在生产者-消费者模型中,生产者负责生产数据,消费者负责对数据进行处理。在这种模式下,ArrayBlockingQueue 可以作为生产者与消费者之间的数据通道,保证线程安全和数据正确。

    实际应用场景

    • Apache Tomcat Apache Tomcat 是一个流行的 JAVA WEB 应用服务器,它使用 ArrayBlockingQueue 来实现内部的请求队列。当请求到达 Tomcat 时,它们被放入一个 ArrayBlockingQueue 中,并由工作线程从队列中取出并处理请求。

    • Netty Netty 是一个高性能的网络编程框架,它使用 ArrayBlockingQueue 来实现内部的事件队列。当有新的网络事件到达时,它们被放入一个 ArrayBlockingQueue 中,并由 IO 线程从队列中取出并处理事件。

    以上就是“ArrayBlockQueue函数及应用场景是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

    --结束END--

    本文标题: ArrayBlockQueue函数及应用场景是什么

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

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

    猜你喜欢
    • ArrayBlockQueue函数及应用场景是什么
      今天小编给大家分享一下ArrayBlockQueue函数及应用场景是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。队列在...
      99+
      2023-07-05
    • Redis数据类型及应用场景是什么
      小编给大家分享一下Redis数据类型及应用场景是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. string类型1-1 ...
      99+
      2024-04-02
    • ssl原理及应用场景是什么
      SSL(Secure Sockets Layer)是一种加密协议,用于保护在互联网上传输的数据安全。它使用公钥加密来保护数据的机密性...
      99+
      2023-06-12
      ssl原理 ssl
    • 响应函数numy在PHP中的应用场景是什么?
      在PHP中,响应函数numy是一种非常重要的函数,它可以用于各种场景中,包括数学计算、数据分析、图像处理等等。本文将介绍响应函数numy的基本用法和在PHP中的应用场景。 一、什么是响应函数numy? 响应函数numy是一个强大的数学库,它...
      99+
      2023-11-09
      numy 响应 函数
    • MySQL锁机制及应用场景是什么
      本文小编为大家详细介绍“MySQL锁机制及应用场景是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL锁机制及应用场景是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。锁的概述MySQL锁是操作My...
      99+
      2023-07-05
    • ZooKeeper核心原理及应用场景是什么
      这篇文章将为大家详细讲解有关ZooKeeper核心原理及应用场景是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。为什么会有ZooKeeper 我们知道要写一个分布式应用是非常困...
      99+
      2023-06-02
    • Promise.race()方法功能及应用场景是什么
      这篇文章主要介绍了Promise.race()方法功能及应用场景是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Promise.race()方法功能及应用场景是什么文章都会有所收获,下面我们一起来看看吧。当...
      99+
      2023-07-05
    • Redis的应用场景是什么
      小编给大家分享一下Redis的应用场景是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一丶Redis介绍Redis是一个开源...
      99+
      2024-04-02
    • C++sort函数应用场景及效率分析
      c++ sort() 函数用于对容器元素排序,使用快速排序算法,默认按升序排序。其广泛应用于数字、字符串和对象排序,但对于大规模数据集效率较低。实战案例演示了使用 sort() 对数组进...
      99+
      2024-04-02
    • python强大的hook函数使用及应用场景
      目录什么是hook?hook应用场景(一)requests 使用hookmitmproxy 中的hook自己实现hookhook应用场景(二)实现动态调用hook什么是hook? 钩...
      99+
      2023-05-19
      python hook函数使用 python hook
    • Java函数数据类型在Apache中的应用场景是什么?
      Apache是一个开源的、跨平台的Web服务器,也是目前最流行的Web服务器之一。它的核心是Apache HTTP Server,是一个高性能的Web服务器,支持多种操作系统和编程语言。Java是一种面向对象的编程语言,常用于Web开发、...
      99+
      2023-08-16
      函数 数据类型 apache
    • java反射机制及常用应用场景是什么
      这篇文章主要介绍“java反射机制及常用应用场景是什么”,在日常操作中,相信很多人在java反射机制及常用应用场景是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java反射机制及常用应用场景是什么”的疑...
      99+
      2023-06-29
    • 索引函数在 Java 中的实际应用场景是什么?
      在 Java 中,索引函数是一个重要的数据结构,它可以提高数据检索的效率。索引函数是一种数据结构,它可以将数据表中的每个记录与一个索引值相对应,这个索引值可以是数据表中的一个属性或多个属性的组合。当我们需要检索数据时,只需要查询索引表,就...
      99+
      2023-09-02
      索引 函数 api
    • 什么是redis数据库,及其使用场景
      redis 是一种开源键值存储数据库,通过将数据存储在内存中提供极高的性能。它支持多种数据结构,例如字符串、哈希表、链表和集合。redis 的应用场景广泛,包括缓存、会话管理、消息传递、...
      99+
      2024-04-19
      redis
    • Numpy中Meshgrid函数介绍及2种应用场景
      Meshgrid函数是NumPy中的一个函数,用于生成一个二维坐标网格。它接受两个一维数组作为输入,然后返回两个二维数组,分别表示这...
      99+
      2023-09-20
      Numpy
    • 有哪些常用的PHP函数,及其应用场景?
      php 提供丰富的函数库,包括:字符串操作函数: 获取长度、转换大小写、替换字符、拆分字符串。数学函数: 获取绝对值、四舍五入、求最大最小值、计算幂。日期和时间函数: 显示当前时间、返回...
      99+
      2024-04-18
      php 常用函数
    • Discuz究竟是什么?功能及应用场景解析
      Discuz究竟是什么?功能及应用场景解析 随着互联网的发展,人们对于在线交流和社交的需求日益增加,各种论坛、社交平台应运而生。其中,Discuz(翻译为“底部”)是一款知名的开源论坛...
      99+
      2024-03-02
      功能 应用 discuz
    • PHP中数据类型的分类及其应用场景是什么?
      PHP是一种广泛使用的服务器端编程语言。在PHP中,数据类型是程序员必须了解的一个重要概念。在本文中,我们将讨论PHP中的数据类型及其应用场景。 PHP中的数据类型可以分为以下几类: 整数类型(Integer) 浮点数类型(Float) ...
      99+
      2023-11-08
      日志 数据类型 apache
    • 函数式编程在Golang中的最佳应用场景是什么?
      函数式编程在 go 中的最佳应用场景是:并发和并行计算:fp 不可变数据和无副作用函数确保并发任务不会相互干扰。事件处理:fp 重点是不可变性,适合处理事件而无需担心副作用。数据转换和管...
      99+
      2024-04-13
      golang 函数式编程
    • TensorFlowLite是什么它用于什么应用场景
      TensorFlow Lite是谷歌开发的一种轻量级的深度学习框架,是TensorFlow的移动和嵌入式设备版本。它专门设计用来在资...
      99+
      2024-03-01
      TensorFlow
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作