在使用wait,notify和notifyall可能会抛出java.lang.IllegalMonitorStateException
首先我们先看看java.lang.IllegalMonitorStateException的说明:
public class IllegalMonitorStateExceptionextends RuntimeException
抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
从以下版本开始:
JDK1.0
然后再贴2段代码,首先是一个会抛出该异常的代码
package com.wikimore.threadtest;
/**
* Hello world!
*
*/
public class App {
private static Object lock = new Object();
public static void main(String[] args) {
Runnable r1 = new Runnable() {
public void run() {
System.out.println("t1 running");
try {
System.out.println("t1 waiting");
lock.wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t1 running again");
lock.notifyAll();
}
};
Thread t1 = new Thread(r1, "thread-1");
Runnable r2 = new Runnable() {
public void run() {
System.out.println("t2 running");
try {
System.out.println("t2 waiting");
lock.wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2 running again");
lock.notifyAll();
}
};
Thread t2 = new Thread(r2, "thread-2");
Runnable r3 = new Runnable() {
public void run() {
System.out.println("t3 running");
try {
System.out.println("t3 waiting");
lock.wait(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t3 running again");
lock.notifyAll();
}
};
Thread t3 = new Thread(r3, "thread-3");
t1.start();
t2.start();
t3.start();
}
}
这段代码的线程在调用wait和notifyall方法时,均没有获得lock的同步锁,等于是没有指定监视器。
再来一段不会抛出异常的代码:
package com.wikimore.threadtest;
/**
* Hello world!
*
*/
public class App {
private static Object lock = new Object();
public static void main(String[] args) {
Runnable r1 = new Runnable() {
public void run() {
System.out.println("t1 running");
synchronized (lock) {
try {
System.out.println("t1 waiting");
lock.wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t1 running again");
lock.notifyAll();
}
}
};
Thread t1 = new Thread(r1, "thread-1");
Runnable r2 = new Runnable() {
public void run() {
System.out.println("t2 running");
synchronized (lock) {
try {
System.out.println("t2 waiting");
lock.wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2 running again");
lock.notifyAll();
}
}
};
Thread t2 = new Thread(r2, "thread-2");
Runnable r3 = new Runnable() {
public void run() {
System.out.println("t3 running");
synchronized (lock) {
try {
System.out.println("t3 waiting");
lock.wait(10000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t3 running again");
lock.notifyAll();
}
}
};
Thread t3 = new Thread(r3, "thread-3");
t1.start();
t2.start();
t3.start();
}
}
这段代码在运行wait方法前会获得lock的同步,故不会出现上述异常。
wait方法执行时会释放锁,所以如果不在同步块中执行的话,很可能就会出现异常。
与wait相似的sleep方法在执行时就不会释放锁,这个需要注意防止阻塞!
分享到:
相关推荐
Java 同步方式 wait和notify/notifyall
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
源码—Java多线程5—死锁和wait notify notifyAll
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
wait()、notify()和notifyAll()方法1---马克-to-win java视频
wait()、notify()和notifyAll()方法2---马克-to-win java视频
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
一个简单的线程同步机制,也能实例了解wait notify的使用,notify与notifyAll的区别
主要介绍了Java 中Object的wait() notify() notifyAll()方法使用的相关资料,需要的朋友可以参考下
本篇文章是对java的 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下
3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以在任何地方调用; 4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,...
Java多线程同步(wait()notify()notifyAll())[文].pdf
主要介绍了Java多线程基础 线程的等待与唤醒,需要的朋友可以参考下
主要介绍了Java wait和notifyAll实现简单的阻塞队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本篇文章是对java多线程 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下
绍java多线程之wait(),notify(),notifyAll()
自己写的一个生产者消费者问题的一个实例,特别注意了wait,notify和notifyAll的不同应用场景。
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
4.线程间通信:lock、condition、wait、notify、notifyAll 5.Lock-free:atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList 6.关于锁的经验介绍 7.并发流程控制手段:CountDownLatch、Barrier 8.定时器:...