天天看点

和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据

3 构造方法

3.1 无参

注意这是没有无参构造方法的哦!必须设置容量!

3.2 有参

  • 创建具有给定(固定)容量和默认访问策略(非公平)的ArrayBlockingQueue
  • 和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据
  • 创建具有给定(固定)容量和指定访问策略的ArrayBlockingQueue
  • 和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据
  • 创建一个具有给定(固定)容量,指定访问策略并最初包含给定集合的元素的ArrayBlockingQueue,该元素以集合的迭代器的遍历顺序添加.
  • 和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据

fair 参数

指定

读写锁

是否公平

  • 公平锁,锁竞争按先来先到顺序
  • 非公平锁,锁竞争随机

3 新增数据

ArrayBlockingQueue有不同的几个数据添加方法,add、offer、put方法,数据都会按照 putIndex 的位置新增.

3.1 add

  • 如果可以在不超过队列容量的情况下立即将指定元素插入此队列的尾部,则在成功插入时返回true,如果此队列已满则抛出IllegalStateException.
  • 和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据
  • 调用的是抽象父类 AbstractQueue的 add 方法
  • 和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据

offer

  • 之后又是调用的自身实现的 offer 方法.
  • 和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据

enqueue

在当前放置位置插入元素,更新并发出信号.

仅在持有锁时可以调用

  • 内部继续调用入队方法
  • 和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据
  • 类似的看 put 方法.

3.2 put

  • 将指定的元素插入此队列的末尾,如果队列已满,则等待空间变为可用.
  • 和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据
  • 实现类似 add,不再赘述.

4 取数据

从队首取数据,我们以 poll 为例看源码.

4.1 poll

和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据

dequeue

  • 提取当前位置的元素,更新并发出信号.仅在持有锁时可调用.
  • 和阿里面试官扯了半小时ArrayBlockingQueue源码(中)3 构造方法3 新增数据4 取数据

继续阅读