ArrayBlockingQueue

ArrayBlockingQueue

内部结构为数组,维护了两个指针,分别指向take 和 put的坐标,每次添和取都会使指针+1,当达到数组长度时,则会重置为0
当执行put时,若队列已满,则会阻塞,当执行take时,若队列为空,同样会阻塞,怎么实现的呢,其实在队列内部,维护了一个RetreentLock 和 两个Condition,分别为notFull 和 notEmpty


1562778583(1).jpg
1562778740(1).jpg

当执行put时,会先检查队列是否已满,若已满则 notFull await, 若未满,则执行入队操作,同时sigal notEmpty
类似的,当执行take时,会检查队列是否为空,若为空,则notEmpty await, 若非空,则执行取操作,同时signal not Full


1562778968(1).jpg

1562779035(1).jpg

假设队列为空,threadA,threadB 执行take,则会被阻塞在notEmpty上,直到 threadC 执行put操作,notEmpty被激活,threadA,threadB 重新竞争锁,优胜者会重新确定队列是否非空,若非空则执行enqueue

你可能感兴趣的:(ArrayBlockingQueue)