Java中notify和notifyAll的区别
Java提供了两个方法notify和notifyAll来唤醒在某些条件下等待的线程。但是Java中的notify和notifyAll之间存在细微差别。
-
当你调用notify时,只有一个等待线程会被唤醒而且它不能保证哪个线程会被唤醒,这取决于线程调度器。
-
如果你调用notifyAll方法,那么等待该锁的所有线程都会被唤醒,但是在执行剩余的代码之前,所有被唤醒的线程都将争夺锁定,这就是为什么在循环上调用wait,因为如果多个线程被唤醒,那么线程是将获得锁定将首先执行,它可能会重置等待条件,这将迫使后续线程等待。
-
因此,notify和notifyAll之间的关键区别在于notify只会唤醒一个线程,而notifyAll方法将唤醒所有线程。
何时在Java中使用notify和notifyAll
- 如果所有线程都在等待相同的条件,并且一次只有一个线程可以从条件变为true,则可以使用notify 而不是 notifyAll。
- 在这种情况下,notify是优于notifyAll 因为唤醒所有这些因为我们知道只有一个线程会受益而所有其他线程将再次等待,所以调用notifyAll方法只是浪费CPU
- 虽然这看起来很合理,但仍有一个问题,即无意中的接收者吞下了关键通知。通过使用notifyAll,我们确保所有收件人都会收到通知
网友评论