什么是ArrayBlockingQueue
ArrayBlockingQueue底层是由数组实现的定长阻塞队列(阻塞表示如果没有原始那么获取元素会阻塞当前线程)
ArrayBlockingQueue用来干嘛
ArrayBlockingQueue一般用于生产者消费者模型业务(排队机制,先进先出)
源码解析
数据的存储
|
|
数据的操作
add
remove
update
public E poll() {//获取队列头部元素,获取后设置为空
final ReentrantLock lock = this.lock;
lock.lock();
try {
return (count == 0) ? null : extract();//如果当前队列为空直接返回null,不为空调用extract()
} finally {
lock.unlock();
}
}
//获取队列头部元素,获取后设置为空
//take获取原始如果队列为空会进入阻塞状态知道等到有添加元素才会去返回
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();//lock.lockInterruptibly如果检测到有Thread.interrupted();会直接抛出异常
try {
while (count == 0)
notEmpty.await();//如果没有元素进入等待状态,等待被唤醒
return extract();
} finally {
lock.unlock();
}
}
//peek查看队列头部元素
public E peek() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return (count == 0) ? null : itemAt(takeIndex);//如果元素为空直接返回null,不为空条用itemAt(takeIndex)
} finally {
lock.unlock();
}
}
private E extract() {
final Object[] items = this.items;
E x = this.
items[takeIndex] = null;//当前元素设置为空
takeIndex = inc(takeIndex);//获取原始递增
–count;//队列元素递减
notFull.signal();//通知notFull.await()可以进行插入元素
return x;//返回当前获取原始
}
//获取元素
final E itemAt(int i) {
return this.
}
```
什么时候扩容
定长队列,不能进行扩容
是否线程安全
线程安全
使用注意事项
- ArrayBlockingQueue为定长队列
- ArrayBlockingQueue的添加和获取方法都有提供阻塞和非阻塞的根据需要使用