📜  Javawait()和notify()的区别(1)

📅  最后修改于: 2023-12-03 15:01:49.513000             🧑  作者: Mango

Java中的wait()和notify()的区别

简介

在Java中,wait()和notify()是Object类中的两个方法,用于在多线程编程中实现线程间的协作和通信。

wait()方法用于使一个线程进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它。

notify()方法用于唤醒一个正在等待该对象锁的线程,使其从等待状态进入可运行状态。

区别

以下是wait()和notify()之间的几个主要区别:

1. 使用方式
  • wait()方法只能在同步代码块或同步方法中调用,需要获得对象的锁才能调用该方法。例如:

    synchronized (obj) {
        obj.wait();
    }
    
  • notify()方法也需要在同步代码块或同步方法中调用,同样需要获得对象的锁。例如:

    synchronized (obj) {
        obj.notify();
    }
    
2. 被唤醒的线程
  • wait()方法被调用后,当前线程会释放对象的锁,进入等待状态,直到其他线程通过notify()或notifyAll()方法唤醒它。

  • notify()方法会唤醒正在等待该对象锁的某一个线程,具体唤醒哪个线程是不确定的,取决于线程调度器的策略。

3. 唤醒顺序
  • wait()方法和notify()方法使用时,线程之间的唤醒顺序是不确定的。因此,在多线程编程中不能依赖于线程的具体执行顺序。

  • 如果需要有序唤醒线程的话,可以考虑使用更高级别的同步工具,如Semaphore或Condition。

4. 必须在同步块中使用
  • 在调用wait()和notify()方法时,必须在同步代码块中使用,否则会抛出IllegalMonitorStateException异常。这是因为这两个方法依赖于对象的内置锁来实现线程的等待和唤醒。

  • 例如,下面的代码片段会引发异常:

    obj.wait(); // 抛出IllegalMonitorStateException异常
    

    正确的用法应该是:

    synchronized (obj) {
        obj.wait();
    }
    
5. notifyAll方法
  • notifyAll()方法会唤醒所有正在等待该对象锁的线程,让它们从等待状态进入可运行状态。

  • 这个方法常用于唤醒多个等待线程的场景,避免只能唤醒一个线程而其他线程仍然处于等待状态的情况。

总结

wait()和notify()是Java中用于线程间协作和通信的重要方法。区别主要包括使用方式、被唤醒的线程、唤醒顺序、必须在同步块中使用和notifyAll()方法的差异。

在多线程编程中,理解这些区别并正确使用wait()和notify()方法对于实现线程间的有序协作是非常重要的。