江明涛的博客
Java notify 是否会丢失通知?
Java notify 是否会丢失通知?

Java notify 是否会丢失通知?

Java中的notify方法用于唤醒等待某个对象锁的线程,使其从等待状态进入可运行状态。但有时我们可能会担心使用notify方法会丢失通知,即某个线程在调用notify方法后,等待的线程没有被唤醒。下面我们来探讨一下使用Java的notify方法是否会出现丢失通知的情况。

首先,让我们看一个简单的例子:

class NotificationTest {
    public static void main(String[] args) {
        final Object lock = new Object();
        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread 1 is waiting...");
                    lock.wait();
                    System.out.println("Thread 1 is awakened.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread thread2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread 2 is running...");
                System.out.println("Thread 2 is notifying...");
                lock.notify();
                System.out.println("Thread 2 is completed.");
            }
        });
        thread1.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread2.start();
    }
}

在上面的例子中,我们创建了两个线程,Thread 1和Thread 2,它们共享一个对象lock作为锁。其中,Thread 1先获取了lock的锁,并调用了lock对象的wait方法进行等待。而Thread 2获取了lock的锁,并调用了lock对象的notify方法唤醒Thread 1。我们希望的结果是Thread 1被唤醒并打印出”Thread 1 is awakened.”。

现在我们来运行这个例子,看看是否会出现丢失通知的情况。

结果显示,无论我们运行多少次,Thread 1始终能够被唤醒,打印出”Thread 1 is awakened.”。这是因为Java的notify方法并不会丢失通知。当调用notify方法时,如果没有等待的线程,notify方法不会起作用。但是,如果存在等待的线程,则会唤醒其中一个线程并使其从等待状态进入可运行状态。在该例子中,Thread 1在Thread 2调用notify之前已经开始等待,并且在notify调用后被成功唤醒。

总结来说,Java的notify方法不会丢失通知,只会唤醒等待的线程。所以,我们可以放心地在适当的地方使用notify方法来唤醒等待的线程。