- 浏览: 607085 次
- 性别:
- 来自: 深圳
-
文章分类
- 全部博客 (300)
- Web前端 (27)
- Java疑难 (60)
- 面试 (59)
- 汇编语言 (1)
- 计算机组成原理 (2)
- 操作系统 (3)
- 计算机网络 (6)
- C/C++疑难 (9)
- SSH (2)
- Web开发 (15)
- 故障 (3)
- 软件开发 (16)
- Portal开发 (1)
- 后台开发 (6)
- 数据库 (35)
- 设计模式 (4)
- 数据结构与算法 (4)
- Linux (3)
- 项目管理 (10)
- 多线程 (12)
- 嵌入式 (9)
- 网络编程 (4)
- 架构设计 (20)
- 软件工具技巧 (7)
- 并行并发 (4)
- 窗口编程 (7)
- 串口编程 (0)
- Flex (2)
- 协议 (1)
- 通讯方式 (4)
- 性能分析优化 (5)
- 测试相关 (4)
- 海量数据处理 (2)
- JAVA核心技术 (10)
- SOA (3)
- 攻略规划 (1)
- 爬虫/搜索 (2)
- 正则表达式 (1)
- A Comparison Of NoSQL Database Management Systems And Models (1)
最新评论
-
charles751:
分析的很好!但有一点:只要同步组合操作就可以了,不一定非要sy ...
Vector 是线程安全的? -
S346618898:
core Java中有一段:Vector类对自己的所有可修改方 ...
Vector 是线程安全的? -
code_cj:
基本上明白了.但执行顺是否应该是/etc/profile -& ...
profile bashrc bash_profile之间的区别和联系 -
xd2008ck:
各自有各自的场景吧楼主不要太激进了
Vector 是线程安全的? -
zwt2001267:
写的不错,赞一个
Vector 是线程安全的?
关于方法notify()和notifyAll()哪些说法是正确的??
请选出两个正确答案
A)类Thread的一个实例有一个名为notify()的方法,该方法可以被调用。
B)一个到方法notify()的调用将唤醒当前拥有对象锁定的线程。
C)方法notify()是同步的。
D)方法notifyAll()在类Thread中被定义的。
E)当有超过一个线程在等待获得一个对象的锁定时,那么就无法确定notify()方法将通知哪个线程。
A是对的,因为万物皆是类,Thread对象也是Object对象,所以也拥有notify方法,这种说法看似乎很怪,想想线程本身拥有这两个方法,未必有用,但在线程池中,线程做为一个对象进行存取控制的时候,就有用了。
B是错的。B的不是特别严谨,notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。另外还一个严重的说法错误,如果现有线程不是对象锁定的主人,那么将抛出一个IllegalMonitorStateException错误。
C是错的。notify方法在Object类中定义,但调用notify必须在同步代码块中调用。此方法不同步,但是如果现有线程不是对象锁定的主人,那么将抛出一个IllegalMonitorStateException,这两者理解上千万不要混淆在一起。在API中,方法的原型说明:
public final void notify()
wait
方法,在对象的监视器上等待。D是错的。明显是错的。
E是对的。对象在wait时会释放synchonrized的锁,被唤醒后会重新获取。notify() 是随机选择其中一个唤醒,其它仍然在wait。notifyAll() 是全部都唤醒,全部都尝试重获锁,当然只有其中一个会得到并继续执行,其它得不到锁的继续等待,但这时是等待锁,而不是等待notify。
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者的最大区别在于:
notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,它们就会去竞争。notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。
import java.util.*; class Widget{} class WidgetMaker extends Thread{ List finishedWidgets=new ArrayList(); public void run(){ try{ while(true){ Thread.sleep(5000);//act busy Widget w=new Widget(); //也就是说需要5秒钟才能新产生一个Widget,这决定了一定要用notify而不是notifyAll //因为上面两行代码不是同步的,如果用notifyAll则所有线程都企图冲出wait状态 //第一个线程得到了锁,并取走了Widget(这个过程的时间小于5秒,新的Widget还没有生成) //并且解开了锁,然后第二个线程获得锁(因为用了notifyAll其他线程不再等待notify语句 //,而是等待finishedWidgets上的锁,一旦锁放开了,他们就会竞争运行),运行 //finishedWidgets.remove(0),但是由于finishedWidgets现在还是空的, //于是产生异常 //***********这就是为什么下面的那一句不能用notifyAll而是要用notify synchronized(finishedWidgets){ finishedWidgets.add(w); finishedWidgets.notify(); //这里只能是notify而不能是notifyAll } } } catch(InterruptedException e){} } public Widget waitForWidget(){ synchronized(finishedWidgets){ if(finishedWidgets.size()==0){ try{ finishedWidgets.wait(); } catch(InterruptedException e) {} } return finishedWidgets.remove(0); } } } public class WidgetUser extends Thread{ private WidgetMaker maker; public WidgetUser(String name,WidgetMaker maker){ super(name); this.maker=maker; } public void run(){ Widget w=maker.waitForWidget(); System.out.println(getName()+"got a widget"); } public static void main(String[] args) { WidgetMaker maker=new WidgetMaker(); maker.start(); new WidgetUser("Lenny",maker).start(); new WidgetUser("Moe",maker).start(); new WidgetUser("Curly",maker).start(); } }
发表评论
-
file.encoding
2015-07-23 23:43 2543参考链接 http://blog. ... -
java常用工具
2015-03-30 17:05 800jpsjstatjstackjinfojmap -
后台线程(守护线程)
2014-04-09 23:42 1428所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的 ... -
Spring配置文件xsi:schemaLocation无法解析导致启动失败的解决方案
2014-03-27 16:59 3059来源http://www.jnan.org/archives ... -
Java 内存模型
2014-01-08 10:05 703Java 内存模型 转自WIKI,自由的百科全书 跳转到 ... -
抽象类与接口选择
2013-12-06 00:20 920从设计理念层面看 abst ... -
javac和java的路径问题
2013-11-03 22:57 5760javac和java的路径问题 ... -
Java调用dll的路径问题解决
2013-10-18 00:37 2749前言:一般我们在用java写jni类库的时候,总是得把生成的 ... -
Java Ant build.xml详解
2013-07-21 23:52 9661、什么是antant是构建 ... -
Java疑难点总结
2013-06-07 02:41 11171.类加载和初始化 加载——>连接(验证-> ... -
Java 虚拟机是如何判定两个 Java 类是相同
2013-05-27 17:17 1162Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的 ... -
java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别
2013-05-21 11:05 986这2个东西应该是java里很常见,很简单,他们都和clas ... -
深入探讨 Java 类加载器
2013-05-21 11:06 850参考 深入探讨 Java 类加载器 http://ww ... -
深入探讨 Java 类加载器
2013-05-20 15:51 817摘自http://www.ibm.com/develope ... -
深入探讨 Java 类加载器
2013-05-20 15:48 977<!--[if !mso]> <styl ... -
final变量需要显示初始化
2013-05-20 00:15 979final int f = 10;//final in ... -
try-catch-finally中return的执行情况
2013-05-18 12:04 1787public class -
Java远程通讯可选技术及原理
2013-05-13 11:13 984源自http://www.blogjava.net/Blue ... -
Java EJB、CORBA、Webservices分布式通信基本原理及特点
2013-05-13 10:19 15291. Java远程调用的特点是什么 2. Java ... -
java传参是传值还是传引用
2013-04-28 00:44 1380个人觉得java是传值,当参数类型是基本类型,复制的是值,而 ...
相关推荐
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
Java中的`notify`和`notifyAll`是多线程编程中的关键方法,它们用于线程间的通信,特别是在处理同步机制时。这两个方法都是在`Object`类中定义的,因此可以应用于任何Java对象。 首先,我们需要理解Java的同步机制...
Java中的`notify`和`notifyAll`方法是多线程编程中的重要概念,它们都是`Object`类的方法,用于在同步控制中唤醒等待在特定对象监视器上的线程。理解这两个方法的区别对于编写高效的并发代码至关重要。 首先,`...
6. notify 和 notifyAll的区别notify方法只唤醒一个等待(对象的)线程并使该线程开始执行,而notifyAll 会唤醒所有等待(对象的)线程。 五、wait、notify、notifyAll方法的使用场景 wait、notify、notifyAll方法...
Java中的多线程编程是构建高效并发应用的关键技术之一,其中`wait()`、`notify()`和`notifyAll()`是Java对象锁机制中的三个关键方法,它们位于`java.lang.Object`类中,主要用于线程间通信。本文将深入探讨`notify()...
Java中的多线程协同工作是通过一系列的同步机制来实现的,其中wait、notify和notifyAll是基于对象监视器的同步原语。这些方法在Java的Object类中定义,主要用于线程间的通信和协作,确保资源的安全访问。下面将详细...
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
本文总结了Java多线程与并发系列的22道高频面试题,涵盖了多线程的实现方法、线程停止、notify和notifyAll的区别、sleep和wait的区别、volatile关键字的作用等多方面的知识点。 一、Java中实现多线程的方法 Java中...
源码—Java多线程5—死锁和wait notify notifyAll
Java提供了多种同步机制来控制多个线程对共享资源的互斥访问,包括synchronized关键字和Object类中的wait、notify和notifyAll方法。synchronized关键字可以用来修饰方法或者代码块,确保同一时刻只有一个线程可以...
- 使用wait、notify和notifyAll时,应避免死锁和活锁。 ### 三、Lock接口 Java 5引入了java.util.concurrent.locks包,其中的Lock接口提供了比synchronized更细粒度的锁控制。Lock接口提供了一些额外的功能,如可...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
wait()、notify()和notifyAll()方法2---马克-to-win java视频
wait()、notify()和notifyAll()方法1---马克-to-win java视频
线程通信:展示线程间的通信机制,包括wait、notify和notifyAll的使用。 线程池管理:提供线程池的使用示例,展示如何有效管理线程资源。 原子变量操作:展示如何使用AtomicInteger等原子类进行线程安全的变量操作。...
11. **线程同步**:Java提供synchronized、wait、notify和notifyAll等机制来控制线程并发。wait使线程进入等待状态,notify和notifyAll唤醒等待的线程。 12. **线程与进程**:进程是系统资源分配的基本单位,线程是...
Java多线程基础中的线程等待与唤醒是一种常见的线程协作机制,通过wait()、notify()和notifyAll()方法来实现线程之间的同步和通信。在本节中,我们将详细介绍wait()、notify()和notifyAll()方法的使用和实现原理。 ...
本文将深入探讨Java中的wait()、notify()和notifyAll()方法,以及synchronized关键字和原子操作在多线程环境中的应用。 1. **wait()方法**: - wait()是Object类的一个方法,它的作用是让当前线程暂停执行并释放它...
本实例着重讲解如何运用Java多线程中的wait、notify和notifyAll这三个关键字,它们是Java对象锁机制的一部分,用于线程间的通信和同步。 1. **线程的创建与启动** - 继承`Thread`类:创建一个新的类,该类继承自`...