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)》

文章介绍了Java中wait()和notify()方法的使用,这两个方法必须在synchronized同步块内调用,否则会抛出IllegalMonitorStateException。示例代码展示了wait()等待和notify()通知的线程协作场景。wait()会使线程释放对象锁并进入等待状态,而notify()则唤醒等待队列中的一个线程。文章还解释了这两个方法背后的原理,涉及对象锁的监视器和等待集的概念。
3126

被折叠的 条评论
为什么被折叠?



