关于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 ...
随机推荐
- easyui学习笔记9—手风琴格子的增,删和选择
这一篇中我们将看看如何给手风琴动态的增加,删除格子,怎样选择某一个格子的. 1.先看看引用的资源 <link rel="stylesheet" href="jque ...
- MATLAB入门学习(二)
关于矩阵 ~o( =∩ω∩= )m matlab矩阵运算很强大 ,几乎所有涉及矩阵运算的命令都有. 事实上,matlab里面所有变量都是以矩阵的形式保存下来的. 一个数字是1x1矩阵 我们来看看矩阵的 ...
- BZOJ3143:[HNOI2013]游走(高斯消元)
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- JS解析json数据(如何将json字符串转化为数组)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...
- springmvc(2)处理器设配器和映射器
非注解的处理器 映射器 和 适配器 一.处理器映射器 1.BeanNameUrlHandlerMapping <bean class="org.springframework.web ...
- bootstrap table 解析写死的json.并且把进度条放进列中。
function showPhaseInfo(phase){ //json字符串转json对象 var phaseInfo = eval(phase); $('#phaseTable').bootst ...
- win8安装wampserver报403错误解决方法
看着别人开始体验win8了,前几天我也安装了win8系统,总体来说还不错,但是今天安装完Wampserver后,浏览器输入localhost,竟然报了403错误,我以为我安装出错了,后来研究了半天,发 ...
- Using Lookup Tables to Accelerate Color Transformations
转自:http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter24.html In feature-film visual-effects ...
- UE4 Navmesh 室内导航设置
我用的UE版本是4.14.1 系统:win10 64 前不久给样板房里面做了一个扫地机器人,导航设置让我头大了很久,度娘也没有用,最后在谷哥上有所感悟,现在给出本人的设置过程和解决方案. 一开始拖 ...
- DML-修改
一, 修改单表的记录 语法: update 表名 set 字段=值[where 筛选条件] 二,修改多表 update 表名 别名 inner/left/rigth join 表二 on 连接条件 s ...