
Java多线程经常会使用到notifyAll方法,下面重点来详解notifyAll方法的作用与使用@mikechen
notifyAll方法定义
notifyAll() 方法是java.lang.Object类的一个方法,用于唤醒等待在同一个对象上的所有线程。
notifyAll方法作用
notifyAll() 通常用于解决多线程编程中的线程同步问题,特别是在使用对象的等待和通知机制时。
当一个线程调用了对象上的 notifyAll() 方法时,所有在该对象上等待的线程都会被唤醒,它们将重新竞争执行权。
notifyAll方法示例
调用语法:
public final void notifyAll()
以下是一个示例,演示了如何使用 notifyAll() 方法来唤醒等待的线程。
public class MyThread extends Thread {
    private Object lock;
    public MyThread(Object lock) {
        this.lock = lock;
    }
    @Override
    public void run() {
        synchronized (lock) {
            System.out.println(getName() + " is waiting.");
            try {
                lock.wait(); // 线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getName() + " is awake.");
        }
    }
    public static void main(String[] args) {
        Object lock = new Object();
        MyThread thread1 = new MyThread(lock);
        MyThread thread2 = new MyThread(lock);
        thread1.start();
        thread2.start();
        try {
            Thread.sleep(1000); // 等待一秒钟,确保两个线程都在等待状态
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (lock) {
            lock.notifyAll(); // 唤醒所有等待在lock对象上的线程
        }
    }
}
在上面的示例中,两个线程(thread1 和 thread2)等待在同一个对象 lock 上。
当主线程调用 lock.notifyAll() 时,这两个线程都会被唤醒。
notifyAll注意事项
主要包含几点:
- notifyAll() 方法应该在同步块或同步方法中调用,以确保线程安全。
- 使用 notifyAll()方法时要小心,因为它会唤醒所有等待的线程,可能导致资源争用和性能问题。
- 如果只需要唤醒一个等待线程,可以使用 notify()方法。
- 在调用 notifyAll() 之后,等待线程之间的执行顺序是不确定的,具体取决于操作系统和线程调度器。
关于mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。