关于java的wait、notify、notifyAll方法
wait、notify、notifyAll
遇到的问题
之前开发打印机项目,因为需要使用多线程技术,当时并不怎么理解,一开始随意在方法体内使用wait、notify、notifyAll 方法导致出现了一大堆 IllegalMonitorStateException 异常。为什么会出现这个异常这和这三个方法内部的机制有关。
同步机制
wait 和 notify 是 java 同步机制中重要组成部分。使用时需结合 synchronized 关键字。 
同步分为类级别和对象级别,分别对应着类锁和对象锁。其实类也可以看成是一个 Class 对象。每个类只有一个类锁,每个对象也只有一个对象锁。要想达到同步状态,操作时必须获取对应的对象/类锁,保证其他地方不能同时更改对象/类的状态。
关于 wait、notify、notifyAll
- wait 
调用wait的时候,线程会释放其占有的对象锁,同时不会主动去申请获取对象锁,必须等待被唤醒的时候,才拥有获得对象锁的权利。 - notify 
唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个对象在等待,而且具有随机性) - -notifyAll 
唤醒所有在等待该对象同步锁的线程,该方法虽然是对每个wait的线程都调用一次notify,但还是有顺序的,每个对象都保存这一个等待对象链,调用的顺序就是这个链的顺序。 
注:
调用了wait、notify、notifyAll 方法必须在同步状态,即已获取了对象锁,所以在使用时候必须搭配 synchronized 关键字一起用,否则就会抛出 java.lang.IllegalMonitorStateException ,所以之前遇到的问题就是因为在没有保证同步的时候调用了这些方法。
notifyAll 虽然能唤醒所有线程,但并不是所有线程立刻获得执行的机会,因为要获得执行的机会,必须首先获得对象锁,但是同一时刻只有线程能够获得对象锁。所以在调用 notifyAll 方法之后,同一时刻只有一个线程获得执行的机会,其他线程须等待该线程执行完毕释放对象锁才有机会执行
这三个方法都属于Object对象,而不属于线程级别,它们的使用都与锁有关
关于java的wait、notify、notifyAll方法的更多相关文章
- Java多线程_wait/notify/notifyAll方法
		
关于这三个方法,我们可以查询API得到下列解释: wait():导致当前的线程等待,直到其他线程调用此对象的notify( ) 方法或 notifyAll( ) 方法或者指定的事件用完 notify( ...
 - java 为什么wait(),notify(),notifyAll()必须在同步(Synchronized)方法/代码块中调用?
		
wait()作用:该方法用来将当前线程置入休眠状态,直到接到通知或被中断为止.条件:在调用wait()之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法.进入wai ...
 - java使用wait(),notify(),notifyAll()实现等待/通知机制
		
public class WaitNotify { static boolean flag=true; static Object lock=new Object(); static class Wa ...
 - java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
		
在Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity.所有对象的非同步方法都能够在任意时刻被任意线程调用 ...
 - [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
		
在 Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity. 所有对象的非同步 方法都能够在任意时刻被任意线 ...
 - 为什么 wait()方法和 notify()/notifyAll()方法要在同步块  中被调用 ?
		
这是 JDK 强制的,wait()方法和 notify()/notifyAll()方法在调用前都必须先获得对 象的锁
 - Java多线程--wait(),notify(),notifyAll()的用法
		
忙等待没有对运行等待线程的 CPU 进行有效的利用(而且忙等待消耗cpu过于恐怖,请慎用),除非平均等待时间非常短.否则,让等待线程进入睡眠或者非运行状态更为明智,直到它接收到它等待的信号. Java ...
 - Java通过wait()和notifyAll()方法实现线程间的通信
		
Java代码(使用了2个内部类): package Threads; import java.util.LinkedList; /** * Created by Frank */ public cla ...
 - Java多线程8:wait()和notify()/notifyAll()
		
轮询 线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作. 想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处 ...
 - [译]Java Thread wait, notify和notifyAll示例
		
Java Thread wait, notify和notifyAll示例 Java上的Object类定义了三个final方法用于不同线程间关于某资源上的锁状态交互,这三个方法是:wait(), not ...
 
随机推荐
- webpack学习(三)html-webpack-plugin插件
			
一.html-webpack-plugin插件 简单创建 HTML 文件,用于服务器访问 例如:我们要为输出文件添加哈希值标记,避免老的不变的文件重新加载,避免新修改的文件受缓存影响. 在前后两次在终 ...
 - 字符串拼接+和concat的区别
			
+和concat都可以用来拼接字符串,但在使用上有什么区别呢,先来看看这个例子. public static void main(String[] args) { // example1 String ...
 - DataTable和Json的相互转换
			
1 #region DataTable 转换为Json字符串实例方法 2 /// <summary> 3 /// GetClassTypeJosn 的摘要说明 4 /// </sum ...
 - 理解JavaScript对象
			
理解JavaScript对象 对象是JavaScript的基本数据类型.对象是一种复合值:将很多值(原始值或者其他对象)聚合在一起. JavaScript对象不仅可以保持自有的属性,还可以从原型对象继 ...
 - Selenium应用代码(常见封装的方法二)
			
滚动窗口: //将滚动条滚到适合的位置 , 方法一 public static void setScroll(WebDriver driver,int height){ try { // String ...
 - springboot+mybatis+shiro——登录认证和权限控制
			
转载:https://z77z.oschina.io/ 一.引入依赖 shiro-all包含shiro所有的包.shiro-core是核心包.shiro-web是与web整合.shiro-spring ...
 - Redis口令设置
			
./redis-cli -h 192.168.128.131 -p 6379 #指定IP和端口启动对应的Redis服务 config set requirepass yourPassword #设置令 ...
 - Semi-Supervised Dimensionality Reduction
			
今天阅读了一篇关于半监督降维的论文,做个总结.这篇论文的全名叫<Semi-Supervised Dimensionality Reduction>(2006),是南大周志华老师的大作. 本 ...
 - JavaSE注释
			
注解在JavaSE中算是比较高级的一种用法了,为什么要学习注解,我想大概有以下几个原因: 1. 可以更深层次地学习Java,理解Java的思想. 2. 有了注解的基础,能够方便阅读各种框架的源码,比如 ...
 - maven编译package慢
			
mvn package编译出现连接不上mvn库的问题: [root@localhost nnnnn]# mvn package[INFO] Scanning for projects...Downlo ...