栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

可以通知多次唤醒同一线程吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

可以通知多次唤醒同一线程吗?

我的回答有一些特定于实现的信息。它基于我对Sun JVM和其他线程库行为的工作知识。

如果两个生产者线程调用notify,是否保证将唤醒两个不同的正在等待的使用者线程?

不它不是。不能保证会有任何消费者醒来。可以保证的是,如果有2个线程在等待,那么会将2个 不同的 线程放入运行队列。

还是

notify()
彼此之间很快触发的两个s导致同一用户线程排队两次唤醒?

否。两次

notify()
调用不会导致同一使用者线程两次排队。但是,这可能会导致一个线程被唤醒,并且可能没有其他线程在等待,因此第二个
notify()
调用可能什么都不做。当然,线程本可以被唤醒,然后又回到等待状态,这样就可以进行第二次
notify()
调用,但是我认为这不是您要的。

Java是否有一些原子内部操作可仅一次唤醒线程?

是。该

Thread
代码具有许多同步点。通知线程后,将其移出
wait
队列。将来的调用
notify()
将进入
wait
队列,但找不到该线程。

还有一点 很重要 。对于生产者/消费者模型,请始终确保您正在

while
循环测试条件。原因是存在与竞争者的竞争条件,这些竞争者被锁定但没有等待条件。

 synchronized (workQueue) {     // you must do a while here     while (workQueue.isEmpty()) {         workQueue.wait();     }     workQueue.remove(); }

Consumer1
可能在等待
workQueue

Consumer2
可以
synchronized
在运行队列中被阻止。如果事情被放入
workQueue
workQueue.notify()
被调用。
Consumer2
现在进入运行队列,但 落后于
Consumer1
谁先行。这是一个常见的实现。所以,
Consumer1
去在将删除的项目
workQueue
Consumer2
被通报的。
Consumer2
必须再次测试是否
workQueue
为空,否则
remove()
将抛出异常,因为队列再次为空。有关比赛的更多详细信息,请参见此处。

同样重要的是要认识到已经记录了虚假

while
唤醒,因此该循环可以防止未经
wait()
调用而唤醒线程。

综上所述,如果您可以通过使用

BlockingQueue
其他答案中建议的减少生产者/消费者代码,则应该这样做。该
BlockingQueue
代码已经解决了所有这些问题。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574372.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号