Concurrency 为什么并发控制使用经典的双条件算法

Concurrency 为什么并发控制使用经典的双条件算法,concurrency,java,Concurrency,Java,在阅读ArrayBlockingQueue的源代码时,我发现一条评论,解释它使用了“任何教科书中都可以找到的经典双条件算法”: 为什么它使用经典的双条件(notEmpty,notFull)算法?您已经有了很好的评论。只是作为补充 ArrayBlockingQueue是一个状态相关类。这意味着该类具有只能在某些前提下执行的操作 仅当前提条件(notFull)为false时,写入线程才会等待 //如果队列已满,则写入程序需要等待 //原子地释放锁并等待信号(读取器触发的notFull.signal(

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


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

您已经有了很好的评论。只是作为补充

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

仅当前提条件(notFull)为false时,写入线程才会等待

//如果队列已满,则写入程序需要等待
//原子地释放锁并等待信号(读取器触发的notFull.signal())
while(count==items.length)
未满。等待()

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

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

当一个线程醒来时,您需要两件主要的事情:
1-去拿锁

2-重新测试条件

它只允许唤醒对刚刚发生的事情感兴趣的线程。例如,一个线程试图从一个空队列中
获取
,只关心队列是否为空(有东西可以获取),而不关心队列是否已满。这是一个很好的答案:)您的问题表明您不同意或不理解作者的决定。你知道他本可以选择的其他方法是什么吗?
/*
 * 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;