JavaDriver JavaDriver
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YoungAnn

西二旗Java老司机一枚 致力于社会主义添砖Java
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础

    • Java 异常有哪些类型?
    • HashMap 与 ConcurrentHashMap 的实现原理是怎样的?
    • Java 中接口和抽象类的区别
    • 为什么重写 equals 必须重写 hashcode ?
    • == 和 equals() 的区别?
    • String,StringBuffer,StringBuilder 之间有什么区别?
    • 简述 ArrayList 与 LinkedList 的底层实现以及常见操作的时间复杂度
    • 简述 BIO, NIO, AIO 的区别
    • 在一个静态方法内调用一个非静态成员为什么是非法的?
    • 简述 Java 的反射机制及其应用场景
    • Java 类的加载流程是怎样的?
    • 什么是双亲委派机制?
    • Java 中 sleep() 与 wait() 的区别
    • 简述 Java 中 final 关键字的作用
    • String 类能不能被继承?为什么?
    • Java 缓冲流 buffer 的用途和原理是什么?
    • 简述动态代理与静态代理
    • 阻塞队列都有哪几种,有什么区别?
      • 阻塞队列都有哪几种,有什么区别?
    • 简述 HashSet 实现原理
  • 并发

  • JVM

  • 设计模式

  • Java相关
  • 基础
YoungAnn
2022-04-04
目录

阻塞队列都有哪几种,有什么区别?

# 阻塞队列都有哪几种,有什么区别?

java.util.concurrent.BlockingQueue 接口有以下阻塞队列的实现:

FIFO 队列 :LinkedBlockingQueue、ArrayBlockingQueue(固定长度)
优先级队列 :PriorityBlockingQueue
延时队列 : DelayQueue
同步队列 : SynchronousQueue

java.util.concurrent.BlockingQueue提供了阻塞的 take() 和 put() 方法:如果队列为空 take() 将阻塞,直到队列中有内容;如果队列为满 put() 将阻塞,直到队列有空闲位置。

LinkedBlockingQueue 1.内部是用链表实现的
2.默认容量是 Integer.MAX_VALUE
3.队列中的锁是分离的,其添加采用的是putLock,移除采用的则是takeLock,这样能大大提高队列的吞吐量,也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能
4.会生成一个额外的Node对象。这可能在长时间内需要高效并发地处理大批量数据的时,对于GC可能存在较大影响
5.在无界的情况下,可能会造成内存溢出等问题。
ArrayBlockingQueue 1.ArrayBlockingQueue 是最典型的有界队列
2.其内部是用数组存储元素的
3.利用 ReentrantLock 实现线程安全,添加操作和移除操作采用的同一个ReenterLock锁
4.在创建它的时候就需要指定它的容量,之后也不可以再扩容了
5.构造函数中我们同样可以指定是否是公平的
PriorityBlockingQueue 1.无界阻塞队列
2. 支持优先级,可以通过自定义类实现 compareTo() 方法来指定元素排序规则
DelayQueue 1.无界队列
2.放入的元素必须实现 Delayed 接口
3.内部使用了 PriorityQueue 的能力来进行排序
SynchronousQueue 容量为 0,所以没有一个地方来暂存元素,导致每次取数据都要先阻塞,直到有数据被放入;同理,每次放数据的时候也会阻塞,直到有消费者来取
编辑 (opens new window)
上次更新: 2022/05/19, 21:26:01
简述动态代理与静态代理
简述 HashSet 实现原理

← 简述动态代理与静态代理 简述 HashSet 实现原理→

最近更新
01
电商-商品系统设计
12-17
02
关于如何写OKR
12-09
03
对事不对人 vs 对人不对事
12-09
更多文章>
Theme by Vdoing | Copyright © 2022-2023 YoungAnnn | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式