3.0 Java:notify()与notifyAll()的区别是什么?| Java Debug 笔记

167 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:Java中的notify()与notifyAll()的区别是什么?

如果你在谷歌搜索”Java:notify()与notifyAll()的区别是什么?“就会弹出很多解释。

最重要的区别就是Java中的notify()只唤醒了一个等待的线程,而notify()唤醒了所有的等待的线程。

除此以外(如果我理解正确的话),当我们只选择一个处于等待状态的线程的话,在第一种情况下,由虚拟机选择线程进行唤醒,而在第二种情况下,由系统线程调度程序进行选择,程序员并不了解他们的具体选择过程。

还有什么区别对我编程是有用的?我有错过什么知识点吗?

回答1:

除此以外(如果我理解正确的话),当我们只选择一个处于等待状态的线程的话,在第一种情况下,由虚拟机选择线程进行唤醒,而在第二种情况下,由系统线程调度程序进行选择,程序员并不了解他们的具体选择过程。

上面这个是不对的,o.notifyAll()会唤醒所有因调用o.wait()而阻塞的线程,这些线程会逐个从o.wait()中返回出来,并且每个线程都会被返回。

简而言之,这取决于您的线程为何在等待被通知。您是否要告诉一个正在等待的线程发生了什么,还是要同时告诉所有这些线程?

在某些情况下,等待完成后,所有等待线程都可以采取有用的措施。一个示例是一组等待特定任务完成的线程。任务完成后,所有等待的线程都可以继续其业务。在这种情况下,您可以使用notifyAll()来同时唤醒所有等待的线程。

另一种情况,例如互斥锁定,只有一个等待线程在得到通知后可以做一些有用的事情(在这种情况下,获取锁定)。在这种情况下,您宁愿使用notify()。正确实现后,在这种情况下也可以使用notifyAll(),但是会导致不必要地唤醒了无法执行任何操作的线程。