📅  最后修改于: 2023-12-03 15:01:49.513000             🧑  作者: Mango
在Java中,wait()和notify()是Object类中的两个方法,用于在多线程编程中实现线程间的协作和通信。
wait()方法用于使一个线程进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它。
notify()方法用于唤醒一个正在等待该对象锁的线程,使其从等待状态进入可运行状态。
以下是wait()和notify()之间的几个主要区别:
wait()方法只能在同步代码块或同步方法中调用,需要获得对象的锁才能调用该方法。例如:
synchronized (obj) {
obj.wait();
}
notify()方法也需要在同步代码块或同步方法中调用,同样需要获得对象的锁。例如:
synchronized (obj) {
obj.notify();
}
wait()方法被调用后,当前线程会释放对象的锁,进入等待状态,直到其他线程通过notify()或notifyAll()方法唤醒它。
notify()方法会唤醒正在等待该对象锁的某一个线程,具体唤醒哪个线程是不确定的,取决于线程调度器的策略。
wait()方法和notify()方法使用时,线程之间的唤醒顺序是不确定的。因此,在多线程编程中不能依赖于线程的具体执行顺序。
如果需要有序唤醒线程的话,可以考虑使用更高级别的同步工具,如Semaphore或Condition。
在调用wait()和notify()方法时,必须在同步代码块中使用,否则会抛出IllegalMonitorStateException异常。这是因为这两个方法依赖于对象的内置锁来实现线程的等待和唤醒。
例如,下面的代码片段会引发异常:
obj.wait(); // 抛出IllegalMonitorStateException异常
正确的用法应该是:
synchronized (obj) {
obj.wait();
}
notifyAll()方法会唤醒所有正在等待该对象锁的线程,让它们从等待状态进入可运行状态。
这个方法常用于唤醒多个等待线程的场景,避免只能唤醒一个线程而其他线程仍然处于等待状态的情况。
wait()和notify()是Java中用于线程间协作和通信的重要方法。区别主要包括使用方式、被唤醒的线程、唤醒顺序、必须在同步块中使用和notifyAll()方法的差异。
在多线程编程中,理解这些区别并正确使用wait()和notify()方法对于实现线程间的有序协作是非常重要的。