关于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中的多线程编程是构建高效并发应用的关键技术之一,其中`wait()`、`notify()`和`notifyAll()`是Java对象锁机制中的三个关键方法,它们位于`java.lang.Object`类中,主要用于线程间通信。本文将深入探讨`notify()...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
- 解释了如何通过wait、notify和notifyAll方法实现线程间的通信与协作。 - 探讨了生产者消费者问题,包括单生产者单消费者、多生产者多消费者等模式的实现。 6. 单例模式在多线程下的实现 - 讨论了在多线程环境...
多线程的实现方式包括继承Thread类和实现Runnable接口,面试中可能还会讨论线程同步和通信的方法,如wait、sleep、notify和notifyAll,以及线程间的共享变量、wait/notify机制、Lock和Condition等。 此外,面试中还...
读者将学习如何使用java.lang.Thread类、synchronized和volatile关键字以及wait、notify和notifyAll方法来启动、控制和协调并发活动。此外,书中还提供了并发编程各个方面详细覆盖,包括诸如并发控制、死锁和冲突、...
为了解决生产者和消费者之间的问题,Java提供了一系列的同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及高级的BlockingQueue接口。 首先,我们要理解生产者消费者模型的基本概念。在该...
此外,书中还会涉及Java内存模型和线程通信,比如wait、notify和notifyAll方法,以及volatile关键字的作用。理解这些概念对于编写正确且高效的并发代码至关重要。同时,JVM的垃圾收集机制以及其对并发性能的影响也会...
基于Java多线程的并发编程指南 项目简介 本项目是一个基于Java多线程的并发编程指南,旨在帮助开发者理解和掌握Java中的多线程编程技术。... 等待与通知通过wait()、notify()和notifyAll()方法实现线程间的通信。
- 研究同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法。 - 探讨死锁、活锁和饥饿问题以及如何避免它们。 6. **IO流与NIO** - 了解字节流、字符流、缓冲流、对象流的区别。 - 分析...
wait()和sleep()可以让线程暂停执行,notify()和notifyAll()用于唤醒等待的线程。 5. 析构函数与虚函数:在C++中,析构函数用于对象销毁时清理资源,而虚函数用于实现多态。Java没有析构函数,但有finalize()方法,...
接下来,我们讨论`wait()`和`notify()`,这两个方法涉及到对象级别的同步。它们通常与`synchronized`关键字一起使用。`wait()`会让当前线程等待,直到其他线程调用同一个对象的`notify()`或`notifyAll()`。`wait()`...
6. **多线程**:Lesson09可能会讨论线程的创建、同步和通信,包括synchronized关键字、wait()、notify()和notifyAll()方法。 7. **反射API**:Lesson10可能包含对反射的理解,即在运行时检查和操作类、接口、字段和...
值得注意的是,wait()和notify()必须在同步代码块中执行,且必须是同一个锁对象调用这两个方法,这是因为只有持有该锁对象的线程才能操作与该对象相关的等待池。 具体到生产者和消费者问题,它是一个经典的多线程...
- 讨论线程同步机制,如wait(), notify()和notifyAll()方法。 - 阐述死锁、活锁和饥饿现象,以及如何避免它们。 6. **JVM相关** - 详解Java内存模型(JMM),包括堆内存、栈内存和方法区。 - 讲解垃圾收集...
2. **多线程**:涵盖线程的创建与管理,同步机制(synchronized,wait,notify,notifyAll),以及线程池。 3. **网络编程**:讲解Socket通信,HTTP协议,以及使用URL和URLConnection进行网络访问。 4. **文件和对象...
- wait()、notify()和notifyAll()方法是Object类中用于线程通信的方法,用于实现线程间的协调工作。 - 线程在调用wait()方法后会释放对象锁,并阻塞等待,直到其他线程调用notify()或notifyAll()。 #### 最小同步...
5. `wait()`, `notify()`和`notifyAll()`方法的使用和意义,以及它们在线程通信中的角色。 6. 并发问题的识别和解决,如死锁、活锁、饥饿和竞态条件。 7. 使用源码分析线程行为,理解和调试并发问题的方法。 8. 常用...
在描述中虽然没有具体信息,但提到的博客链接(https://metaphy.iteye.com/blog/406870)可能包含了更详细的讨论,包括线程同步和通信机制,比如synchronized关键字、wait()、notify()和notifyAll()方法,以及...