notify()和 notifyAll()有什么区别?

2 个回答

  • 林雷
    如果无能为力,那就顺其自然。如果心无所待,那就随遇而安。
    ### notify() 和 notifyAll() 的区别 在 Java 中,`notify()` 和 `notifyAll()` 方法用于唤醒在对象上等待的线程。它们的区别如下: 1. **notify() 方法**: - 作用:唤醒在对象上等待的一个线程。 - 问题:可能导致死锁,因为只有一个线程被唤醒,其他线程仍然在等待队列中。 - 使用场景:适用于所有等待线程都可以处理相同条件的情况。 2. **notifyAll() 方法**: - 作用:唤醒在对象上等待的所有线程,使它们重新进入锁的争夺队列中。 - 优点:不会导致死锁,因为所有等待线程都被唤醒,避免了单个线程无法处理情况的发生。 ### 使用注意事项 - **wait() 应配合 while 循环使用**: - 不应使用 if,而应使用 while 循环检查条件。 - 在 `wait()` 调用前后检查条件是否满足,如果不满足,继续调用 `wait()` 直至条件满足。 - **notify() 的正确使用场景**: - 适用于等待相同条件的线程,当任意一个被唤醒都能正确处理接下来的事项。 - 如果唤醒的线程无法正确处理,应确保继续 `notify()` 下一个线程,并且自身需要重新回到等待队列中。 ### 示例代码 ```java public class NotifyExample { private final Object lock = new Object(); public void waitForCondition() { synchronized (lock) { while (!condition) { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } // 处理满足条件后的逻辑 } } public void signalCondition() { synchronized (lock) { condition = true; lock.notifyAll(); // 或者使用 lock.notify(); } } } ``` `notify()` 适用于等待相同条件的线程,而 `notifyAll()` 更通用,适用于需要唤醒多个线程的情况,以避免死锁风险。
    发布于 2022-06-14 01:32 •IP属地 湖北
    举报
    评论
    收藏

  • java小生
    见过花就好,何必在意花属于谁。
    如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。 当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。也就是说,调用了notify后只要一个线程会由等待池进入锁池,而notifyAll会将该对象等待池内的所有线程移动到锁池中,等待锁竞争。 优先级高的线程竞争到对象锁的概率大,假若某线程没有竞争到该对象锁,它还会留在锁池中,唯有线程再次调用 wait()方法,它才会重新回到等待池中。而竞争到对象锁的线程则继续往下执行,直到执行完了 synchronized 代码块,它会释放掉该对象锁,这时锁池中的线程会继续竞争该对象锁。
    发布于 2021-07-01 19:50 •IP属地 安徽
    举报
    评论
    收藏