java中LinkedBlockingQueue与ArrayBlockingQueue的异同

作者:mdxy-dxy 时间:2023-08-19 02:56:49 

相同:

1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;

2、LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的队列

内部都是使用ReentrantLock和Condition来保证生产和消费的同步;

当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞;

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

使用Condition的方法来同步和通信:await()和signal()

不同:

1、由上图可以看出,他们的锁机制不同

LinkedBlockingQueue中的锁是分离的,生产者的锁PutLock,消费者的锁takeLock

而ArrayBlockingQueue生产者和消费者使用的是同一把锁;

2、他们的底层实现机制也不同

LinkedBlockingQueue内部维护的是一个链表结构

java中LinkedBlockingQueue与ArrayBlockingQueue的异同java中LinkedBlockingQueue与ArrayBlockingQueue的异同

在生产和消费的时候,需要创建Node对象进行插入或移除,大批量数据的系统中,其对于GC的压力会比较大

而ArrayBlockingQueue内部维护了一个数组

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

在生产和消费的时候,是直接将枚举对象插入或移除的,不会产生或销毁任何额外的对象实例

 3、构造时候的区别

LinkedBlockingQueue有默认的容量大小为:Integer.MAX_VALUE,当然也可以传入指定的容量大小

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

ArrayBlockingQueue在初始化的时候,必须传入一个容量大小的值

看其提供的构造方法就能知道

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

4、执行clear()方法

LinkedBlockingQueue执行clear方法时,会加上两把锁

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

 5、统计元素的个数

LinkedBlockingQueue中使用了一个AtomicInteger对象来统计元素的个数

java中LinkedBlockingQueue与ArrayBlockingQueue的异同

ArrayBlockingQueue则使用int类型来统计元素

标签:LinkedBlockingQueue,ArrayBlockingQueue
0
投稿

猜你喜欢

  • Kotlin中的5种单例模式示例详解

    2022-03-01 22:51:58
  • Android 自定义弹性ListView控件实例代码(三种方法)

    2022-04-14 15:00:33
  • Netty分布式高性能工具类同线程下回收对象解析

    2023-05-24 22:00:55
  • Android仿UC浏览器左右上下滚动功能

    2023-08-27 12:43:19
  • Mybatis-Plus自动填充更新操作相关字段的实现

    2022-01-14 20:43:01
  • Android通过原生APi获取所在位置的经纬度

    2022-11-12 17:56:14
  • WPF自定义控件和样式之自定义按钮(Button)

    2022-04-09 14:39:32
  • Java中static关键字的作用和用法详细介绍

    2022-07-05 08:33:53
  • C#使用Socket实现本地多人聊天室

    2022-01-06 12:47:27
  • Java关键字finally_动力节点Java学院整理

    2022-09-25 11:15:30
  • Eclipse项目有红感叹号的解决方法

    2023-02-13 10:54:15
  • Java 回调函数深入理解

    2023-11-01 17:32:04
  • 一文搞懂Java MD5算法的原理及实现

    2023-01-04 21:10:24
  • Spring boot配置 swagger的示例代码

    2023-03-07 13:10:44
  • Maven安装与配置及Idea配置Maven的全过程

    2023-05-20 01:37:59
  • c#使用file.copy实现文件备份示例

    2021-06-03 05:13:13
  • Quartz.Net使用方法详解

    2023-08-17 11:50:54
  • Activity取消界面切换的默认动画方法(推荐)

    2021-05-23 12:12:52
  • Java并发CopyOnWrite容器原理解析

    2023-08-15 09:06:18
  • 解析Java和Eclipse中加载本地库(.dll文件)的详细说明

    2023-11-11 01:23:31
  • asp之家 软件编程 m.aspxhome.com