`
unique5945
  • 浏览: 134478 次
  • 来自: 杭州
社区版块
存档分类
最新评论

关于notify和notifyAll的讨论

    博客分类:
  • JAVA
阅读更多
关于notify和notifyAll的讨论,很有意义,记录下来,写了些自己的心得:对notify notifyAll有疑问的可以参考下这篇讨论http://stackoverflow.com/questions/37026/java-notify-vs-notifyall-all-over-again
很多文章建议使用notifyAll比notfiy安全,但这里的几个回答详细分析了两个方法的适用场景。notifyAll虽然可以唤醒所有处于WAITING(不消耗CPU)的状态的线程,但被唤醒的线程如果依次被执行后马上去争抢锁,就会有大量的线程进入到BLOCKED状态,增加CPU的开销。此时用notify反而更好。第5个解释我觉得比较到位:
1)notify适用于所有等待的线程都是对等的(或者说唤醒顺序对其执行任务无影响),或者适用于本来就只有一个等待线程的场景。不过文中的例子觉得不妥,一般线程池都是设计成可并行执行的,如果只是串行执行就没意义了。应该如第7个解释中说的,适用于资源池,即任意数量的消费者都要从池中获取资源,但一次只能有一个获取到这个资源。可以将生产者消费者的例子修改下,假设消费者和生产者是两个对象,而消费者的get方法里有同步块(代码如下):
public Object get() {
synchronized(lock){//lock可以是所有消费者在执行get时要获取的公共锁
    while (buf.size()==0) {
        wait();
    }
    Object o = buf.remove(0);
    notify();
    return o;
    }
}
则这样用notify就比较合适,只唤醒其它等待的消费者线程中的一个,此处如果改成notfiyAll的话就让其它线程被唤醒后立刻进入BLOCKED状态,增加了CPU的开销。
2)notfiyAll适用于等待的线程有不同的目标,可以并行执行的场景。这样才不至于使所有线程被唤醒后又进入到BLOCKED状态。
分享到:
评论

相关推荐

    基于Java多线程notify与notifyall的区别分析

    Java中的多线程编程是构建高效并发应用的关键技术之一,其中`wait()`、`notify()`和`notifyAll()`是Java对象锁机制中的三个关键方法,它们位于`java.lang.Object`类中,主要用于线程间通信。本文将深入探讨`notify()...

    java中的并发和多线程编程中文版

    读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...

    Java并发编程:设计原则与模式(第二版)

    读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...

    Java多线程编程深入详解

    - 解释了如何通过wait、notify和notifyAll方法实现线程间的通信与协作。 - 探讨了生产者消费者问题,包括单生产者单消费者、多生产者多消费者等模式的实现。 6. 单例模式在多线程下的实现 - 讨论了在多线程环境...

    测试开发面试经验总结.docx

    多线程的实现方式包括继承Thread类和实现Runnable接口,面试中可能还会讨论线程同步和通信的方法,如wait、sleep、notify和notifyAll,以及线程间的共享变量、wait/notify机制、Lock和Condition等。 此外,面试中还...

    Concurrent Programming in Java

    读者将学习如何使用java.lang.Thread类、synchronized和volatile关键字以及wait、notify和notifyAll方法来启动、控制和协调并发活动。此外,书中还提供了并发编程各个方面详细覆盖,包括诸如并发控制、死锁和冲突、...

    java生产者消费者问题

    为了解决生产者和消费者之间的问题,Java提供了一系列的同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及高级的BlockingQueue接口。 首先,我们要理解生产者消费者模型的基本概念。在该...

    实战java高并发编程

    此外,书中还会涉及Java内存模型和线程通信,比如wait、notify和notifyAll方法,以及volatile关键字的作用。理解这些概念对于编写正确且高效的并发代码至关重要。同时,JVM的垃圾收集机制以及其对并发性能的影响也会...

    基于Java多线程的并发编程指南.zip

    基于Java多线程的并发编程指南 项目简介 本项目是一个基于Java多线程的并发编程指南,旨在帮助开发者理解和掌握Java中的多线程编程技术。... 等待与通知通过wait()、notify()和notifyAll()方法实现线程间的通信。

    Java企业面试题

    - 研究同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法。 - 探讨死锁、活锁和饥饿问题以及如何避免它们。 6. **IO流与NIO** - 了解字节流、字符流、缓冲流、对象流的区别。 - 分析...

    java 面试题目之一

    wait()和sleep()可以让线程暂停执行,notify()和notifyAll()用于唤醒等待的线程。 5. 析构函数与虚函数:在C++中,析构函数用于对象销毁时清理资源,而虚函数用于实现多态。Java没有析构函数,但有finalize()方法,...

    java线程分析android project例子

    接下来,我们讨论`wait()`和`notify()`,这两个方法涉及到对象级别的同步。它们通常与`synchronized`关键字一起使用。`wait()`会让当前线程等待,直到其他线程调用同一个对象的`notify()`或`notifyAll()`。`wait()`...

    j2se源码和思维导图

    6. **多线程**:Lesson09可能会讨论线程的创建、同步和通信,包括synchronized关键字、wait()、notify()和notifyAll()方法。 7. **反射API**:Lesson10可能包含对反射的理解,即在运行时检查和操作类、接口、字段和...

    day07【线程池、Lambda表达式】-笔记.pdf

    值得注意的是,wait()和notify()必须在同步代码块中执行,且必须是同一个锁对象调用这两个方法,这是因为只有持有该锁对象的线程才能操作与该对象相关的等待池。 具体到生产者和消费者问题,它是一个经典的多线程...

    JAVA的面试题-汇总!!!

    - 讨论线程同步机制,如wait(), notify()和notifyAll()方法。 - 阐述死锁、活锁和饥饿现象,以及如何避免它们。 6. **JVM相关** - 详解Java内存模型(JMM),包括堆内存、栈内存和方法区。 - 讲解垃圾收集...

    Java核心技术(卷一+卷二全集)

    2. **多线程**:涵盖线程的创建与管理,同步机制(synchronized,wait,notify,notifyAll),以及线程池。 3. **网络编程**:讲解Socket通信,HTTP协议,以及使用URL和URLConnection进行网络访问。 4. **文件和对象...

    Java Threads英文第三版

    - wait()、notify()和notifyAll()方法是Object类中用于线程通信的方法,用于实现线程间的协调工作。 - 线程在调用wait()方法后会释放对象锁,并阻塞等待,直到其他线程调用notify()或notifyAll()。 #### 最小同步...

    thread

    5. `wait()`, `notify()`和`notifyAll()`方法的使用和意义,以及它们在线程通信中的角色。 6. 并发问题的识别和解决,如死锁、活锁、饥饿和竞态条件。 7. 使用源码分析线程行为,理解和调试并发问题的方法。 8. 常用...

    Java线程编程学习笔记(二)

    在描述中虽然没有具体信息,但提到的博客链接(https://metaphy.iteye.com/blog/406870)可能包含了更详细的讨论,包括线程同步和通信机制,比如synchronized关键字、wait()、notify()和notifyAll()方法,以及...

Global site tag (gtag.js) - Google Analytics