java中LinkedBlockingQueue与ArrayBlockingQueue的异同

Java中LinkedBlockingQueue与ArrayBlockingQueue的异同

在Java中,BlockingQueue是一种具有线程安全特性的队列实现,在多线程环境下广泛应用。LinkedBlockingQueue和ArrayBlockingQueue是两种常见的BlockingQueue实现。本篇攻略将详细讲解这两者的异同。

LinkedBlockingQueue

LinkedBlockingQueue是一种基于链表实现的阻塞队列。它的容量大小可以选择无限大或指定大小。

LinkedBlockingQueue通过将插入和删除操作分别在不同的锁上同步进行,并且使用Condition条件变量实现等待通知机制实现多线程的并发访问。一个线程若向已满的LinkedBlockingQueue中插入数据,该线程会阻塞,直到其它线程从该队列中取出数据以空出位置;同样,如果一个线程向一个空LinkedBlockingQueue中取数据,该线程也会被阻塞,直到有数据被放入队列。

下面是一个示例代码:

import java.util.concurrent.LinkedBlockingQueue;

public class LinkedBlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(2);
        queue.put(1);
        queue.put(2);
        System.out.println(queue.take());
        System.out.println(queue.take());
    }
}

运行结果为:

1
2

ArrayBlockingQueue

ArrayBlockingQueue是一种基于数组实现的阻塞队列。它的容量大小在创建时必须指定大小,且大小不可改变。

ArrayBlockingQueue使用单一的锁来控制访问,同样使用Condition条件变量实现等待通知机制实现多线程的并发访问。

当向一个已满的ArrayBlockingQueue中插入数据时,该操作将被阻塞直到有其它线程从队列中删除元素以腾出空间。同理,当从一个空的ArrayBlockingQueue中取数据时,该操作也将被阻塞直到有元素被放入队列。

下面是一个示例代码:

import java.util.concurrent.ArrayBlockingQueue;

public class ArrayBlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(2);
        queue.put(1);
        queue.put(2);
        System.out.println(queue.take());
        System.out.println(queue.take());
    }
}

运行结果为:

1
2

LinkedBlockingQueue与ArrayBlockingQueue的异同

LinkedBlockingQueue和ArrayBlockingQueue的异同可以从几个角度来作对比。

容量大小

LinkedBlockingQueue的容量大小可以选择无限大,也可以指定有限大小,而ArrayBlockingQueue的容量大小必须在创建时确定。

插入和删除操作的锁

LinkedBlockingQueue将插入和删除操作分别在不同的锁上同步进行,而ArrayBlockingQueue使用单一的锁来控制访问。

内部存储结构

LinkedBlockingQueue是基于链表的实现,而ArrayBlockingQueue是基于数组的实现。

性能表现

由于LinkedBlockingQueue内部使用链表存储元素,因此在插入和删除操作时无需移动元素,性能较ArrayBlockingQueue更好。但LinkedBlockingQueue相对ArrayBlockingQueue在空间上更加消耗内存。

总结

如何选择LinkedBlockingQueue和ArrayBlockingQueue要根据实际需求而定。如果希望容量大小可以自动调整,在内存充足的情况下,可以选择LinkedBlockingQueue。如果对内存占用有严格要求或者希望快速执行插入和删除操作,可以选择ArrayBlockingQueue。

欢迎补充。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中LinkedBlockingQueue与ArrayBlockingQueue的异同 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 什么是validationquery

    当然,我很乐意为您提供有关validationQuery的完整攻略。以下是详细的步骤和两个示例: 1. 什么是validationQuery? validationQuery是一个JDBC连接池的配置选项,用于测试连接是否有效。当连接池从数据库获取连接时,它会执行validationQuery语句,如果语句执行成功,则连接有效,否则连接无效。 2. vali…

    other 2023年5月6日
    00
  • asp.net中MD5 16位和32位加密函数

    ASP.NET中MD5 16位和32位加密函数攻略 在ASP.NET中,可以使用MD5算法对字符串进行加密。MD5加密算法可以生成一个128位的哈希值,但是常用的是将其截取为16位或32位的字符串表示形式。下面是详细的攻略,包含两个示例说明。 1. MD5 16位加密函数 MD5 16位加密函数将MD5生成的128位哈希值截取为16位字符串。下面是一个示例代…

    other 2023年7月28日
    00
  • QQ7.1体验版下载地址 新增收藏内容支持搜索关键词

    QQ7.1体验版下载地址攻略 QQ7.1体验版是一款新版本的QQ软件,它新增了收藏内容支持搜索关键词的功能。本攻略将为您提供QQ7.1体验版的下载地址,并详细介绍如何使用新增的收藏内容搜索功能。 下载QQ7.1体验版 您可以按照以下步骤下载QQ7.1体验版: 打开您的浏览器,访问QQ官方网站。 在QQ官方网站的首页或下载页面中,找到QQ7.1体验版的下载链接…

    other 2023年8月4日
    00
  • Java 线程的生命周期完整实例分析

    Java 线程的生命周期完整实例分析 在 Java 中,线程是非常常见的概念。了解线程的生命周期对于正确编写多线程程序是非常重要的。本文将介绍 Java 线程的完整生命周期,并给出两个实例进行说明。 Java 线程的生命周期 Java 线程的生命周期可以归纳为以下 6 个阶段: 新建(New):当线程对象被创建后处于新建状态。 就绪(Runnable):当调…

    other 2023年6月27日
    00
  • Access字符串处理函数整理

    Access字符串处理函数是Access常用的一种函数,它可以用于对字符串的处理以及格式化。本篇攻略将会对Access字符串处理函数整理进行详细讲解,涉及的内容包括常用的Access字符串函数、示例分析以及使用注意事项。下面请详细阅读本篇攻略内容: 一、常用的Access字符串函数 1. Left函数 该函数可以返回一个字符串的左边指定个数的字符。语法如下:…

    other 2023年6月20日
    00
  • 图说超线程技术(Hyper-Threading Technology)

    图说超线程技术(Hyper-Threading Technology) Hyper-Threading Technology(HT Technology)是由英特尔(Intel)开发的一种处理器技术,它可以在单个处理器核心上运行两个(甚至更多)线程,从而提高处理器的性能和吞吐量。在本文中,我们将通过图示来详细解释这项技术。 什么是线程 在计算机中,线程(th…

    其他 2023年3月28日
    00
  • 近红外光谱数据分析–数据预处理(多元散射校正msc)

    近红外光谱数据分析是一种常见的分析技术,可以用于分析和识别各种化学和生物样品。在进行近红外光谱数据分析之前,需要进行数据预处理,消除样品中的干扰和噪声。其中,多元散射校正(MSC)是一种常用的预处理技术,可以消除品中的多元散射效应。以下是多元散射校正(MSC)的完整攻略: 1. 加载光谱数据 先,需要加载近红外光谱数据。可以使用Python中的pandas库…

    other 2023年5月8日
    00
  • Win10开机无限提示你的电脑将在一分钟后自动重启怎么解决?

    该问题是Win10系统常见的一个启动故障,可能的原因有多种,比如硬件问题、系统文件损坏等。解决该问题的方式包括以下几个步骤: 步骤一:进入安全模式 首先需要尝试进入安全模式。安全模式可以让系统以最小的驱动程序和服务启动,以便诊断和解决问题。步骤: 在出现重启提示前,按住键盘上的 Shift 键,让 Win10 停止自动重启; 选择 问题解决 – 高级选项 -…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部