
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睿哥
10年+一线大厂架构实战经验,操盘多个亿级大厂核心项目,就职于阿里、淘宝等一线大厂。