首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么并发控制使用经典的双条件算法?

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

Stack Overflow用户
提问于 2013-04-13 13:08:53
回答 1查看 781关注 0票数 10

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

代码语言:javascript
复制
/*
 * 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)算法?

EN

回答 1

Stack Overflow用户

发布于 2013-04-14 06:22:08

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

ArrayBlockingQueue是一个依赖于状态的类.这意味着该类的操作只能在某些先决条件下执行。

只有在前提条件(notFull)为false时,写入线程才会等待。

//如果队列已满,那么写入器需要等待。

//原子地释放锁并等待信号(由读取器触发的notFull.signal())。

while (count == items.length)

代码语言:javascript
复制
**notFull.await();**

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

//如果队列为空,那么读取器需要等待。

//原子地释放锁并等待信号(由写器触发的notEmpty.signal())。

while (计数== 0)

代码语言:javascript
复制
**notEmpty.await();** 

当线程苏醒时,您需要2件主要的事情:

把锁拿来

2-重新测试条件

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15988140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档