Java面试题之多线程 Java中notify 和 notifyAll有什么区别?
在Java中,notify()
和notifyAll()
都是用于唤醒在对象监视器上等待的线程的方法。它们的主要区别在于唤醒的线程数量和行为。
notify()
notify()
方法会随机唤醒一个在该对象监视器上等待的线程。如果有多个线程在等待,Java虚拟机会选择其中一个线程进行唤醒。notifyAll()
notifyAll()
方法会唤醒所有在该对象监视器上等待的线程。所有被唤醒的线程都会进入就绪状态,但只有一个线程会获得锁并继续执行,其他线程则会继续等待。class SharedResource {
private boolean available = false;
public synchronized void produce() {
available = true;
notify(); // 或者 notifyAll();
}
public synchronized void consume() throws InterruptedException {
while (!available) {
wait();
}
// 处理资源
available = false;
}
}
notify()
时,只有一个等待线程会被唤醒,适合于只需要唤醒一个线程的场景。notifyAll()
时,所有等待线程都会被唤醒,适合于需要所有线程重新检查条件的场景。在选择使用notify()
还是notifyAll()
时,需要根据具体的业务逻辑和需求来决定。