10

在阅读 的源代码时ArrayBlockingQueue,我发现一条评论解释说它使用了“任何教科书中都可以找到的经典双条件算法”:

/*
 * Concurrency control uses the classic two-condition algorithm
 * found in any textbook.
 */

/** Main lock guarding all access */
private final ReentrantLock lock;
/** Condition for waiting takes */
private final Condition notEmpty;
/** Condition for waiting puts */
private final Condition notFull;

为什么它使用经典的二条件(notEmpty,notFull)算法?

4

1 回答 1

3

你已经有很好的评论了。仅作为补充。

ArrayBlockingQueue是一个与状态相关的类。这意味着此类具有只能在某些前提条件下执行的操作。

仅当前提条件(notFull)为假时,编写器线程才会等待。

// 如果队列已满,则 writer 需要等待。
// 以原子方式释放锁并等待信号(读取器触发的 notFull.signal())。
while (count == items.length)
notFull.await();

对于读者来说,这个概念是相同的,但使用了 notEmpty 条件。

// 如果队列为空,则 reader 需要等待。
// 原子地释放锁并等待信号(notEmpty.signal() 由写入器触发)。
while (count == 0)
notEmpty.await();

当线程唤醒时,您需要做两件事:
1 - 获取锁
2 - 重新测试条件

于 2013-04-14T06:22:08.823 回答