ArrayBlockingQueue原理分析

构造方法

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); //重入锁,出队和入队持有这一把锁 
	notEmpty = lock.newCondition(); //初始化非空等待队列 
	notFull = lock.newCondition(); //初始化非满等待队列 
}

关于锁的用途,大家在没有看接下来的源码之前,可以先思考一下他的作用。

items构造以后,大概是一个这样的数组结构

Add方法

以add方法作为入口,在add方法中会调用父类的add方法,也就是AbstractQueue.如果看源码看得比较多的话,一般这种写法都是调用父类的模版方法来解决通用性问题

public boolean add(E e) { 
	return super.add(e); 
}

从父类的add方法可以看到,这里做了一个队列是否满了的判断,如果队列满了直接抛出一个异常

public boolean add(E e) { 
	if (offer(e)) 
		return true; 
	else 
		throw new IllegalStateException("Queue full"); 
} 

offer方法

add方法最终还是调用offer方法来添加数据,返回一个添加成功或者失败的布尔值反馈

这段代码做了几个事情

1. 判断添加的数据是否为空

2. 添加重入锁

3. 判断队列长度,如果队列长度等于数组长度,表示满了直接返回false

4. 否则,直接调用enqueue将元素添加到队列中

public boolean offer(E e) { 
	checkNotNull(e); //对请求数据做判断 
	final ReentrantLock lock = this.lock; 
	lock.lock(); 
	try { 
		if (count == items.length) 
		return false; 
		else { 
		enqueue(e); 
		return true; 
	} 
	} finally { 
		lock.unlock(); 
	} 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值