wait()和notify()方法不在synchronized同步块的内部使用会抛出异常:java.lang.IllegalMonitorStateException
wait()和notify()方法的使用示例
public class WaitNotifyDemo {
static Object locko = new Object();
static class WaitTarget implements Runnable{
public static void main(String[] args) throws InterruptedException {
Thread waitThread = new Thread(new WaitTarget(),"wait thread");
waitThread.start();
Thread.sleep(1000);
Thread notifyThread = new Thread(new NotifyTarget(),"notify thread");
notifyThread.start();
}
@Override
public void run() {
synchronized (locko){
System.out.println("启动等待。。。。。。。。");
try {
locko.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("收到通知,当前线程继续执行。");
}
}
}
static class NotifyTarget implements Runnable{
@Override
public void run() {
synchronized (locko){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入任意指令:");
System.out.println("收到指令:" + scanner.next());
locko.notifyAll();
System.out.println("发通知了,但线程还没有立马释放锁。");
}
}
}
}
wait()方法的原理
1、JVM会释放当前线程的对象锁监视器的Owner资格
2、JVM会将当前线程移入监视器的WaitSet队列
在当前线程执行wait()方法前,必须通过synchronized()方法成为对象锁的监视器的Owner。
notify()方法的原理
JVM从对象锁的监视器的WaitSet队列移动一个线程到其EntryList队列。
在执行notify()方法前,当前线程也必须通过synchronized()方法成为对象锁的监视器的Owner。
《Java高并发核心编程(卷2)》