• 目录:

    ArrayBlockingQueue


    ArrayBlockingQueue,闭着眼睛自己构思一个,用不着翻 jdk 的源码。

    要用数组实现一个阻塞队列。可以拆出三个部分分别讨论。

    1. 队列
    2. 阻塞
    3. 并发

    队列

    首先需要一个数组来存储队列中的数据。

    然后讨论先进先出的特性如何实现,我们需要两个标记,分别记录入队的数据要添加到数组的哪个位置、出队的数据要从哪个位置取。这两个标记都从0下标开始往后走。

    这就出现了一个问题,标记指向的位置不停的往前走,数组不可能为了它无限延长。就需要在逻辑上把数组看成一个环。假设队列容量是12,标志到11后再往前走一格就该变到0了。

    注意限制出队标志不能走到入队标志前面去。

    阻塞

    用 ReentrantLock 建两个 Condition 出来。一个用来队列满时阻塞生产者,一个用来队列空时阻塞消费者。在数据入队的时候去唤醒消费者,数据出队的时候去唤醒生产者。

    并发

    修改数组数据的操作,都用 ReentrantLock 加一下锁。