1、wait()、notify()、notifyAll()使用说明
wait()、notify()和notifyAll()必须在同步方法或同步代码块里调用【synchronized】。
如果在非同步方法或代码块里调用这些方法,程序能够通过编译,但在运行时,将产生IllegalMonitorState异常,并伴随着一些含糊的消息,比如"当前线程不是拥有者"。消息的意思是,调用wait(),notify()和notifyAll()的线程在调用这些方法前必须"拥有"对象的锁。当前的线程不是此对象锁的所有者,却调用该对象的notify(),notify(),wait()方法时抛出该异常。
2、API定义
意思就是说抛出这个异常表明线程尝试等待一个对象的监视器或者去通知其他正在等待这个对象监视器的线程时,但是没有拥有这个监视器的所有权。
3、Java中每个类和对象都有一个同步锁
Java中每个类和对象都有一个同步锁,只有获取到调用同步锁,调用wait和notify方法才行
1 调用所属对象的wait和notify方法
public class Test3 {
//所属对象
public synchronized void waitSelf(){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void notifySelf(){
this.notify();
}
//其他对象
public Object lock = new Object();
public void waitObject(){
synchronized (lock){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void notifyObject(){
synchronized(lock){
lock.notify();
}
}
}
2 调用类的notify和wait方法
public class Test3 {
public static synchronized void notifyClass() {
Test3.class.notify();
}
public void waitClass() {
synchronized (Test3.class) {
try {
Test3.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
把API中所说的监视器(monitor)理解成同步锁。想要执行某个对象的notify(), notifyAll(),wait(), wait(long), wait(long, int)方法就必须获取该对象的锁,需要使用synchronized,不然就会抛出IllegalMonitorStateException异常。