IllegalMonitorStateException 这个到底是怎么来的?

thinkinjava123 2009-11-12 02:09:09

public class ThreadTest {

public static void main(String[] args) {

new Thread(new ThreadDemo()).start();

}
}

class ThreadDemo implements Runnable {
private int i = 0;

public synchronized void run() {
try {
ThreadTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println(Thread.currentThread().getName() + ":" + i);

}
}



上面的代码ThreadTest.class.wait();会报一个 Exception in thread "Thread-0" java.lang.IllegalMonitorStateException 的错误。

1. 请问这个是为什么?
2. 在synchronized中的wait();方法应该怎么用? 我想实现比如ThreadTest.class.wait();这样的wait
然后再在另一个类里面使用 ThreadTest.class.notify(); 为什么是不可行的?
3. 一般来说 使用wait();的最常见情况是什么?

...全文
1453 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Travel light.. 2012-10-21
  • 打赏
  • 举报
回复
不明白!~
benbon 2011-10-18
  • 打赏
  • 举报
回复
楼主不识货啊,18楼的话对你才是真正有用的,其它的都是废话。
hoskyloser 2010-08-02
  • 打赏
  • 举报
回复
骂了隔壁我怎么看不了回复
Ant 2009-11-12
  • 打赏
  • 举报
回复
synchronized的意义在于获得对象锁,如果这个方法是非静态的,好比楼主的例子,那么获得的就是这个Instance的对象锁,如果是静态方法,就必须获得这个Class对象的对象锁

wait()方法的意义是释放当前持有的锁资源,楼主仔细看你的代码
先由于synchronized获得了这个Class的一个Instance的对象锁
第二步却用wait视图释放Class对象的锁,当然会报锁状态错误的异常

即你获得的是new ThreadDemo()的Monitor
但你试图释放的是ThreadDemo.class的Monitor
简而言之就是new ThreadDemo()和ThreadDemo是两个Java对象,好好理解这一层才是关键

对象锁即异常里提到的Monitor

97095639 2009-11-12
  • 打赏
  • 举报
回复
mark
sciolist 2009-11-12
  • 打赏
  • 举报
回复
我曾经遇到过一次,在一个灰常重要的场合 囧
一头头 2009-11-12
  • 打赏
  • 举报
回复
下面这样就对了 你synchronized的是this 却让什么什么class wait()
这个是肯定不可以的哇


public class test1 {

private static final test1 t = new test1();

public static void main(String[] args) {

new Thread(new ThreadDemo(t)).start();

}
}

class ThreadDemo implements Runnable {
private int i = 0;
private test1 t = null;

public ThreadDemo(test1 t) {
this.t = t;
}

public void run() {
synchronized (t) {

try {
t.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println(Thread.currentThread().getName() + ":" + i);

}
}
}
junjun1984 2009-11-12
  • 打赏
  • 举报
回复
调用的对象 没有指定线程?
thinkinjava123 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 swandragon 的回复:]
使用了错误的对象调用了wait

[/Quote]

那如何才算是正确的对象调用wait? 怎么做请问
苍蝇①号 2009-11-12
  • 打赏
  • 举报
回复
wait用的不对
阿士匹灵 2009-11-12
  • 打赏
  • 举报
回复
路过
溜达溜达
owen_008 2009-11-12
  • 打赏
  • 举报
回复
goooooooooooooooooooooood~~~~~加油~~呵呵
swandragon 2009-11-12
  • 打赏
  • 举报
回复
使用了错误的对象调用了wait
  • 打赏
  • 举报
回复
唤醒机制
sainer 2009-11-12
  • 打赏
  • 举报
回复
每天回复下,得个10分
JavaAlpha 2009-11-12
  • 打赏
  • 举报
回复
------解决方案--------------------------------------------------------
如果不正确地管理wait/notify调用,应用程序可能会抛出IllegalMonitorStateException,例如,若不拥有对象的锁标记,而试图用wait/notify协调共享对象资源,应用程序将抛出IllegalMonitorStateException。

IllegalMonitorStateException意味着一个或多个资源可能不再处于一致状态,表示程序出现了严重问题。由于IllegalMonitorStateException是RuntimeException类型,因此它可能中断产生异常的线程。
liaoyi_ipanel 2009-11-12
  • 打赏
  • 举报
回复
IllegalMonitorStateException
wxzyydy 2009-11-12
  • 打赏
  • 举报
回复
顶,谢谢
阿_布 2009-11-12
  • 打赏
  • 举报
回复

public class ThreadTest {

public static void main(String[] args) {

new Thread(new ThreadDemo()).start();

}
}

class ThreadDemo implements Runnable {
private int i = 0;

public synchronized void run() {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println(Thread.currentThread().getName() + ":" + i);

}
}
只有让当前执行的线程放弃对象锁,让其它正在等待的线程先执行。
999朵玫瑰 2009-11-12
  • 打赏
  • 举报
回复
IllegalMonitorStateException
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧