求求你,别再用wait和notify了!(4)

简介: 求求你,别再用wait和notify了!(4)

依旧是两个生产者加一个消费者,实现代码如下:


public static void main(String[] args) {
    Factory factory = new Factory();
    // 生产者
    Thread producer = new Thread(() -> {
        try {
            factory.put();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }, "生产者");
    producer.start();
    // 生产者 2
    Thread producer2 = new Thread(() -> {
        try {
            factory.put();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }, "生产者2");
    producer2.start();
    // 消费者
    Thread consumer = new Thread(() -> {
        try {
            factory.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }, "消费者");
    consumer.start();
}


执行的结果如下图所示:


微信图片_20220120145039.jpg


通过以上结果可以看出:当我们调用 notifyAll 时确实不会造成线程“假死”了,但会造成所有的生产者都被唤醒了,但因为待执行的任务只有一个,因此被唤醒的所有生产者中,只有一个会执行正确的工作,而另一个则是啥也不干,然后又进入等待状态,这就行为对于整个程序来说,无疑是多此一举,只会增加线程调度的开销,从而导致整个程序的性能下降


反观 Conditionawaitsignal 方法,即使有多个生产者,程序也只会唤醒一个有效的生产者进行工作,如下图所示:


微信图片_20220120145055.jpg

相关文章
|
2月前
|
调度
【多线程-从零开始-陆】wait、notify和notifyAll
【多线程-从零开始-陆】wait、notify和notifyAll
42 0
|
6月前
|
Java
JAVA多线程的“心灵感应”:wait()与notify()的秘密
【6月更文挑战第20天】Java多线程中,`wait()`和`notify()`是线程间协作的关键。它们充当线程间的通信桥梁,使得线程能感知对方状态。例如,生产者线程在资源满时`wait()`,消费者线程消费后`notify()`或`notifyAll()`,确保资源有效利用且避免冲突。简化的代码示例展示了这种同步机制,线程通过等待和唤醒操作实现“心灵感应”般的协同工作。
34 3
|
6月前
|
Java
wait()和notify():JAVA多线程世界的“信号兵”
【6月更文挑战第20天】在Java多线程中,`wait()`和`notify()`作为Object类的方法,扮演着线程间协调者的角色。`wait()`让线程等待并释放锁,`notify()`或`notifyAll()`唤醒等待的线程。在生产者-消费者模型中,它们用于同步访问资源,例如队列。当队列满或空时,线程调用wait()暂停,另一方完成操作后用notify()唤醒。理解并正确使用这些“信号兵”对构建高效的多线程程序至关重要。
43 0
|
7月前
|
Java 调度
多线程(初阶五:wait和notify)
多线程(初阶五:wait和notify)
90 0
|
7月前
|
调度
多线程之wait&notify
多线程之wait&notify
|
存储 Java API
面试官:为什么 wait/notify 必须与 synchronized 一起使用??
面试官:为什么 wait/notify 必须与 synchronized 一起使用??
168 0
面试官:为什么 wait/notify 必须与 synchronized 一起使用??
多线程之——wait/notify
多线程之——wait/notify
72 0
|
安全 Java
Java并发编程之Wait和Notify
Java并发编程之Wait和Notify
135 0
Java并发编程之Wait和Notify
|
算法 Java 程序员
Java多线程之死锁问题,wait和notify
Java多线程之死锁问题,wait和notify
259 0
Java多线程之死锁问题,wait和notify
|
安全 Java
并发编程之Wait和Notify
我们把组成程序(Program)各个部分称为线程(Thread)。也可以说,线程就是程序中轻量级的进程(Process)。 多线程(Multithreading)是Java的一个特性,它可以允许一个程序的多个部分(也就是线程)并发地执行,以达到最大程度利用CPU的目的。
179 0