在阅读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)算法?
发布于 2013-04-14 06:22:08
你已经有很好的评论了。只是作为补充。
ArrayBlockingQueue是一个依赖于状态的类.这意味着该类的操作只能在某些先决条件下执行。
只有在前提条件(notFull)为false时,写入线程才会等待。
//如果队列已满,那么写入器需要等待。
//原子地释放锁并等待信号(由读取器触发的notFull.signal())。
while (count == items.length)
**notFull.await();**对于读者来说,概念是相同的,但使用的是notEmpty条件。
//如果队列为空,那么读取器需要等待。
//原子地释放锁并等待信号(由写器触发的notEmpty.signal())。
while (计数== 0)
**notEmpty.await();** 当线程苏醒时,您需要2件主要的事情:
把锁拿来
2-重新测试条件
https://stackoverflow.com/questions/15988140
复制相似问题