feling.net/_posts/2023-01-16-ArrayBlockingQue...

1.2 KiB
Raw Permalink Blame History

layout title categories
pages ArrayBlockingQueue
Java

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

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

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

队列

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

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

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

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

阻塞

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

并发

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

  • 文章目录 {:toc}