江明涛的博客
Java notify 是如何实现的?
Java notify 是如何实现的?

Java notify 是如何实现的?

Java中的notify方法是用来唤醒由wait方法阻塞的线程。在多线程编程中,经常需要控制线程的执行顺序,以保证数据的正确性和一致性。notify方法的实现机制是通过线程对象的monitor进行通信的。

当一个线程调用了对象的wait方法后,该线程会被阻塞,并释放对monitor对象的锁定,进入到等待状态。同时,其它线程如果调用了该对象的notify方法,就会唤醒一个正在等待的线程。被唤醒的线程将会重新竞争monitor对象的锁,如果获得锁,就可以继续执行。

下面是一个简单示例,展示了如何使用Java的notify方法:

// 定义一个共享对象
public class SharedObject {
    private boolean flag = false;
    
    // 获取共享对象的锁
    public synchronized void waitForFlag() {
        while (!flag) {
            try {
                wait(); // 当前线程等待,在这里会释放锁
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        // 执行需要等待的操作...
    }
    
    // 通知等待的线程继续执行
    public synchronized void setFlag() {
        this.flag = true;
        notify(); // 唤醒一个等待的线程,使其继续执行
    }
}
// 使用示例
public class Main {
    public static void main(String[] args) {
        SharedObject sharedObject = new SharedObject();
        
        Thread thread1 = new Thread(() -> {
            sharedObject.waitForFlag();
            System.out.println("Thread 1 completed.");
        });
        
        Thread thread2 = new Thread(() -> {
            System.out.println("Thread 2 started.");
            sharedObject.setFlag(); // 唤醒等待的线程
        });
        
        thread1.start();
        thread2.start();
    }
}

在上面的示例中,我们定义了一个共享对象SharedObject,并使用synchronized关键字来获取共享对象的锁。在waitForFlag方法中,线程会在while循环中一直等待,直到flag变为true。调用wait方法后,当前线程会释放共享对象的锁,并进入等待状态。在setFlag方法中,我们将flag设置为true,并调用notify方法唤醒在等待的线程。当线程被唤醒后,它将重新竞争共享对象的锁,如果获得锁,就可以继续执行。

总结起来,Java的notify方法通过线程的monitor实现了线程间的通信和控制。它的调用可以唤醒一个正在等待的线程,使其继续执行。通过合理使用notify方法,我们可以实现多线程编程中的线程协作和同步。