Java-java中的notify和notifyall具体在哪些场景下使用哪一个比较好?
在多线程编程中,我们需要对利用同步原语对多线程中的race condition进行同步。其中等待原语中的条件变量(condition variable)顾名思义就是一个或多个线程等待某个布尔表达式为真,即等待别的线程“唤醒”它。具体而言,java object内置的wait()、notify()、notifyall()是条件变量。
notify()和notifyall()具体的区别即前者为唤醒某一个等待线程让它继续运行,而notifyall()则使得所有等待线程退出wait状态并再次竞争某个锁。看似notify()和notifyall()在很多场景下可以互换,其实我觉得应该不然。这里想问的是,notify和notifyall分别有哪些优点和缺点,分别使用与哪些具体的场景?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果某个事情导致你需要多个等待线程都去处理,那么 notifyAll(),如果某事情导致只需要一个线程处理,那么就 notify()。
还是用餐厅做菜和端盘子的来表达,如果厨师一次只做出来一个菜,并且马上在窗口放一盘菜,然后按铃( notify)通知 一个服务员就可以了。如果厨师做好了菜都先放到自己的灶台上,然后一下子端了很多盘菜到窗口,那么就需要使劲按铃(notifyAll),让所有的服务员都过来看看能不能碰碰运气拿到一盘菜。