ArrayBlockingQueue使用独占锁ReentrantLock实现线程安全,入队和出队操作使用同一个锁对象,
也就是只能有一个线程可以进行入队或者出队操作;这也就意味着生产者和消费者无法并行操作,在
高并发场景下会成为性能瓶颈。
利用了Lock锁的Condition通知机制进行阻塞控制。
核心:一把锁,两个条件
2.2 ArrayBlockingQueue的原理
数据结构
//数据元素数组1
final Object[] items;2
//下一个待取出元素索引3
int takeIndex;4
//下一个待添加元素索引5
int putIndex;6
//元素个数7
int count;8
//内部锁9
final ReentrantLock lock;10
//消费者11
private final Condition notEmpty;12
//生产者13
private final Condition notFull; 14
15
public ArrayBlockingQueue(int capacity) {16
this(capacity, false);17
}18
public ArrayBlockingQueue(int capacity, boolean fair) {19
...20
lock = new ReentrantLock(fair); //公平,非公平21
notEmpty = lock.newCondition();22
notFull = lock.newCondition();23
}24
25