notify()和notifyAll()的区别是什么?

  notify()和notifyAll()都是Java中用于多线程编程的方法,用于在多线程环境中管理线程的等待和唤醒操作。它们的主要区别在于唤醒的目标线程数以及线程等待的条件。

  1.notify()

  notify()方法用于唤醒等待在对象上的一个随机线程。如果多个线程在同一个对象上等待,那么只有其中的一个线程会被唤醒,但无法确定是哪一个线程。这个方法通常用于线程之间的竞争条件,其中只有一个线程能够获得资源的情况。

  示例代码:

class SharedResource {
    public synchronized void doSomething() {
        System.out.println("Thread " + Thread.currentThread().getId() + " is working.");
        notify(); // 唤醒等待的线程
    }
}

public class NotifyExample {
    public static void main(String[] args) {
        SharedResource resource = new SharedResource();
        
        Runnable task = () -> {
            synchronized (resource) {
                try {
                    System.out.println("Thread " + Thread.currentThread().getId() + " is waiting.");
                    resource.wait(); // 等待资源
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread " + Thread.currentThread().getId() + " is awake.");
            }
        };

        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);

        thread1.start();
        thread2.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        resource.doSomething(); // 唤醒一个等待的线程
    }
}

  在上面的示例中,notify()唤醒了其中一个等待的线程,但不能确定是哪一个线程被唤醒。

  2.notifyAll()

  notifyAll()方法用于唤醒等待在对象上的所有线程。这意味着所有等待的线程都有机会争夺资源。这通常用于广播消息或者在共享资源可用时唤醒所有等待线程的情况。

1698374058708_notify()和notifyAll()的区别是什么.jpg

  示例代码:

class SharedResource {
    public synchronized void doSomething() {
        System.out.println("Thread " + Thread.currentThread().getId() + " is working.");
        notifyAll(); // 唤醒所有等待的线程
    }
}

public class NotifyAllExample {
    public static void main(String[] args) {
        SharedResource resource = new SharedResource();
        
        Runnable task = () -> {
            synchronized (resource) {
                try {
                    System.out.println("Thread " + Thread.currentThread().getId() + " is waiting.");
                    resource.wait(); // 等待资源
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread " + Thread.currentThread().getId() + " is awake.");
            }
        };

        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);

        thread1.start();
        thread2.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        resource.doSomething(); // 唤醒所有等待的线程
    }
}

  在上面的示例中,notifyAll()唤醒了所有等待的线程,它们都有机会争夺资源。

  总结:

  (1)notify()唤醒一个等待的线程,选择唤醒哪个线程不确定。

  (2)notifyAll()唤醒所有等待的线程,它们都有机会争夺资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值