多线程中在while 来await的原因

在看java核心技术讲到多线程中用条件对象,说到通常对await的调用应该在

while(!(ok to proceed))
{
condition.await();
}



我奇怪为什么推荐使用while来判断,可不可以用if

在代码中实验了下,在调用await()之前打印一下"thread will wait",发现用while时会打印大量的"thread will wait",而if时会少很多。这样是不是表示while和if的机制会不一样。想知道这是为什么推荐用while,它和if有啥区别

Mr_Sky
发帖于4年前  2回/1K+阅
Mr_Sky
共有2个答案  最后回答: 4年前
1
因为可能有多个线程await在这里,一个notifyAll,全部唤醒,又要重新竞争,先得到时间片的线程向下运行了,其他线程又需要回到await上。如果不是while,而是if,所有的线程都会走下去了 
--- 共有 2 条评论 ---
逝水fox:  回复 @Mr_Sky : 被线程被唤醒到获得时间片之间,条件有可能变  4年前
Mr_Sky:  是不是就是指,在获得时间片以后,要重新做一次判断,所以用while  4年前
评论(2) 引用此答案 举报
逝水fox
1

举个例子,一个生产者消费者模型的任务队列,一个生产者一次可能放入多个任务,然后用notifyAll通知消费者,但是并非所有被唤醒的消费者都能取到一个任务,那么队列被读空了之后的消费者肯定得继续await。如果你用if来判断,这个消费者第二次被notify的时候就不会再次判断!(ok to proceed)这个条件了,如果这个时候这个消费者又一次没抢到任务,但是代码还是往下执行了,轻则空指针异常,重了干出什么事情来都说不定了。

所以必须用while来检查!(ok to proceed),这样可以保证每次被唤醒都会检查一次条件。

--- 共有 3 条评论 ---
Mr_Sky:  回复 @Maxwell1987 : 明白了,感谢  4年前
Maxwell1987:  回复 @Mr_Sky : 是的,所以它醒了之后你得用while循环让它再去判断一次条件。  4年前
Mr_Sky:  谢谢。线程唤醒以后,是从condition.await(); 后面的代码开始执行对吗?  4年前
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值