Java并发进阶:阻塞队列ArrayBlockingQueue源码解析

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
摘要由CSDN通过智能技术生成

构造器

===

使用ArrayBlockingQueue的时候,必须指定一个capacity阻塞队列的容量。可以传入可选的fair值,以采取不同公平性策略,默认使用非公平的策略。另外,可以传入集合对象,直接构造阻塞队列。

// 必须指定容量, 默认采用非公平策略

public ArrayBlockingQueue(int capacity) {

this(capacity, false);

}

// 另外,可指定公平性策略

public ArrayBlockingQueue(int capacity, boolean fair) {

// 对容量进行简单校验

if (capacity <= 0)

throw new IllegalArgumentException();

this.items = new Object[capacity]; // 初始化底层数组

lock = new ReentrantLock(fair); // 初始化lock

notEmpty = lock.newCondition(); // 初始化条件变量notEmpty

notFull = lock.newCondition(); // 初始化条件变量notFull

}

// 另外,可指定传入集合直接构造

public ArrayBlockingQueue(int capacity, boolean fair,

Collection<? extends E> c) {

this(capacity, fair);

// 加锁只是为了可见性, 而不是为了互斥特性

final ReentrantLock lock = this.lock;

lock.lock(); // Lock only for visibility, not mutual exclusion

try {

int i = 0;

try {

for (E e : c) { // 遍历赋值

checkNotNull(e);

items[i++] = e;

}

} catch (ArrayIndexOutOfBoundsException ex) {

throw new IllegalArgumentException();

}

count = i;

putIndex = (i == capacity) ? 0 : i;

} finally {

lock.unlock();

}

}

出队和入队操作

=======

队列的操作最核心的部分莫过于入队和出队了,后面分析的方法基本上都基于这两个工具方法。

入队enqueue

=========

private void enqueue(E x) {

// assert lock.getHoldCount() == 1;

// assert items[putIndex] == null;

final Object[] items = this.items;

// 把元素x放入数组

items[putIndex] = x;

// 下一个元素应该存放的下标位置

if (++putIndex == items.length)

putIn

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值