java notify怎么实现

Java 中的 notify() 方法可以唤醒等待该对象监视器的线程,步骤如下:唤醒一个或多个正在等待该对象监视器的线程。释放该对象监视器。唤醒的线程继续执行,而释放的监视器

可被其他线程重新获取。

Java 中的 notify() 方法

前言:
notify() 方法是 Java 中 Object 类的一个方法,用于唤醒一个或多个正在等待该对象监视器(lock)的线程。

实现:
notify() 方法的实现非常简单,它会唤醒所有正在等待该对象监视器的线程,然后释放该对象监视器。唤醒的线程将继续执行,而释放的监视器可以被其他线程重新获取。

用法:
notify() 方法通常与 wait() 和 notifyAll() 方法一起使用。线程调用 wait() 方法时,它会放弃该对象监视器并进入等待状态,直到被唤醒或超时。线程调用 notify() 方法时,它会唤醒一个或多个正在等待该对象监视器的线程。

示例:

class ProducerConsumer {
    private final Object lock = new Object();
    private int count = 0;
    private boolean empty = true;

    public void produce() {
        synchronized (lock) {
            while (!empty) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            count++;
            empty = false;
            System.out.println("Produced: " + count);
            lock.notify();  // 唤醒等待消费的线程
        }
    }

    public void consume() {
        synchronized (lock) {
            while (empty) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            count--;
            empty = true;
            System.out.println("Consumed: " + count);
            lock.notify();  // 唤醒等待生产的线程
        }
    }
}

注意:

  • notify() 方法不会释放对象锁,它只是唤醒正在等待该对象的线程。
  • notifyAll() 方法与 notify() 方法类似,但它会唤醒所有正在等待该对象的线程。
  • wait() 方法必须在同步块中调用,否则会抛出 IllegalMonitorStateException 异常。