前言:
之前介绍的关于Queue的实现类,LinkedList、PriorityQueue都是非线程安全的队列,那么有没有线程安全的Queue实现类呢?
当然是有的,在java.util.concurrent中有几个关于Queue的线程安全实现
/**
* @see java.util.concurrent.ArrayBlockingQueue
* @see java.util.concurrent.LinkedBlockingQueue
* @see java.util.concurrent.PriorityBlockingQueue
*/
由名称可以看出来,ArrayBlockingQueue是基于数组实现的;LinkedBlockingQueue是基于链表实现的;PriorityBlockingQueue是基于堆实现的优先级队列
实现方式都是差不多的,只是底层结构不一样,之前的几篇博客已经分析过这些数据结构的不同了,在这里就不再继续分析了,焦点就关注在如何实现线程安全。
本篇博客来分析一下比较典型的ArrayBlockingQueue
1.ArrayBlockingQueue结构分析
/**
* A bounded {@linkplain BlockingQueue blocking queue} backed by an
* array. This queue orders elements FIFO (first-in-first-out).
*/
public class ArrayBlockingQueue extends AbstractQueue
implements BlockingQueue, java.io.Serializable {
// 基于数组存储
/** The queued items */
final Object[] items;
// 下一个获取值的索引
/** items index for next take, poll, peek or remove */
int takeIndex;
// 下一个存放值的索引
/** items index for next put, offer, or add */
int putIndex;
// 队列中元素数量
/** Number of elements in the queue */
int count;
// 锁
/** Main lock guarding all access */
final ReentrantLock lock;
// 锁的条件队列(非空,如果队列已空,则再执行删除元素的是会在此等待)
/** Condition for waiting takes */
private final Condition notEmpty;
// 锁的条件队列(未满,如果队列已满,则再执行添加元素的是会在此等待)
/** Condition for waiting puts */
private final Condition notFull;
笔者把对应的英文注释也拷贝过来了,实际直接看英文注释基本就已经理解了相关成员变量的含义了
2.构造方法
// 1.指定容量构造
public ArrayBlockingQueue(int capacity) {
this(capacity, false);
}
// 2.指定容量和锁的类型
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?