查看完整视频
小黑屋思过中,禁止观看!
评论并刷新后可见

您需要在视频最下面评论并刷新后,方可查看完整视频

积分观看

您支付积分,方可查看完整视频

{{user.role.value}}
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
课程视频

开通VIP,畅学所有专题课程视频

会员专享

视频选集

ArrayBlockingQueue深度源码剖析

  • 课程笔记
  • 交流讨论

并发队列:阻塞与非阻塞队列详解,分别谈到了实现并发队列的两种方式。
方式1:加锁,这种实现方式就是我们常说的阻塞队列。
方式2:使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列。
前一节课我谈了非阻塞队列ConcurrentLinkedQueue的实现,这一节课我会重点来谈阻塞队列的具体实现。

为了助大家掌握好ArrayBlockingQueue,本节课我会重点讲解以下6点:

1.ArrayBlockingQueue介绍
2.ArrayBlockingQueue的数据结构
3.ArrayBlockingQueue的核心成员
4.ArrayBlockingQueue的源码案例
5.ArrayBlockingQueue的核心实现
6.ArrayBlockingQueue的阻塞实现

ArrayBlockingQueue介绍

java.util.concurrent.ArrayBlockingQueue 是一个线程安全的、基于数组、有界的、阻塞的、FIFO 队列。
ArrayBlockingQueue深度源码剖析-mikechen的互联网架构师之路

阻塞队列的2个关键特点:

  • 试图向已满队列中放入元素会导致操作受阻塞。
  • 试图从空队列中提取元素将导致类似阻塞。

ArrayBlockingQueue的核心成员

/** 存放元素的数组 */
final Object[] items;

/** 取元素的下标索引 */
int takeIndex;

/** 存元素的下标索引 */
int putIndex;

/** 队列中元素的数量 */
int count;

/** 控制并非访问的锁 */ 
final ReentrantLock lock; 

/**notEmpty条件对象,用于通知take方法队列已有元素,可执行获取操作 */ 
private final Condition notEmpty;

/**notFull条件对象,用于通知put方法队列未满,可执行添加操作 */ 
private final Condition notFull;

 

ArrayBlockingQueue的数据结构

隐藏内容,您需要满足以下条件方可查看
End
3 条回复 A文章作者 M管理员
  1. 路正银

    ArrayBlockingQueue的实现:
    1、ReentrantLock,入队出队用的是同一把锁,有公平和非公平两种方式,具体体现在条件队列
    2、notFull和notEmpty两个条件队列,put/take操作阻塞之后,加入相应的条件队列,put/take操作成功之后,分别唤醒相反的那个条件队列(入队唤醒消费者、出队唤醒生产者)
    ArrayBlockingQueue的put与take的完整流程如下:

    • mikechen

      非常棒 ,重点都抓住了,还谈到了同一把锁(入队与出队) ✗棒棒的✗

      备注:CopyOnWriteArrayList的作业刚刚我补充了对应的面试必考点,地址:https://mikechen.cc/1045.html

  2. 李鸿翼

    1. 底层是数组
    2.一个reentrantlock锁,并基于这把锁构建了两个condtion,一个是notFull,一个是notEmpty.
    3.put的时候,如果队列已满,阻塞在notFull条件队列上,如果添加成功,通知阻塞在notEmpty队列的线程
    4.take的时候,如果队列是空,阻塞在notEmpty条件队列上,如果拿取元素成功,通知阻塞在notfull对列的线程