notify 、notifyAll

104 阅读1分钟

notifynotifyAll 都是 Java 中用于线程间通信的方法,它们通常与 wait 方法一起使用,用于实现线程间的协作。

  1. notify 方法:

    • notify 用于唤醒等待在同一对象上的一个线程。如果有多个线程在该对象上等待,只会唤醒其中的一个,但是不确定是哪一个。
    • 通常情况下,使用 notify 是因为在某个时刻只需要唤醒一个等待线程,而其他线程可以继续等待或执行其他任务。
    synchronized (sharedObject) {
        // 一些逻辑
        sharedObject.notify();
    }
    
  2. notifyAll 方法:

    • notifyAll 用于唤醒等待在同一对象上的所有线程。当有多个线程在该对象上等待时,调用 notifyAll 会唤醒它们全部。
    • 通常情况下,使用 notifyAll 是因为在某个时刻需要唤醒所有等待线程,以便它们可以重新竞争锁或执行其他操作。
    synchronized (sharedObject) {
        // 一些逻辑
        sharedObject.notifyAll();
    }
    
  3. 注意事项:

    • 在使用 notifynotifyAll 时,通常需要在同步块或同步方法中调用,以确保线程安全。
    • 使用 notifynotifyAll 时,被唤醒的线程需要重新竞争锁,才能继续执行。
    • 使用 notifynotifyAll 时,建议放在同步块的最后,以便在释放锁之前完成相关逻辑,避免唤醒的线程在执行时发生竞态条件。

选择使用 notify 还是 notifyAll 取决于具体的需求。在某些情况下,使用 notify 可能会更有效率,但需要确保唤醒的线程是确定的。在其他情况下,为了避免线程死锁或其他问题,使用 notifyAll 是更安全的选择。