A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhohao 中级黑马   /  2014-6-20 19:41  /  1035 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhohao 于 2014-6-30 08:23 编辑

java.lang.IllegalMonitorStateException出现这个异常显示该怎么办?从了哪里入手?

7 个回复

倒序浏览
在代码里下断点,调试
回复 使用道具 举报
youngkay 发表于 2014-6-20 20:28
在代码里下断点,调试

非常感谢,继续学习中。
回复 使用道具 举报
本帖最后由 张益达 于 2014-6-30 12:57 编辑

你敢不敢先看看这个异常是什么异常  亲
回复 使用道具 举报
抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
关于IllegalMonitorStateException异常:
api中的解释
public class IllegalMonitorStateExceptionextends RuntimeException

抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。



从以下版本开始:
JDK1.0
另请参见:
Object.notify(), Object.notifyAll(), Object.wait(), Object.wait(long), Object.wait(long, int), 序列化表格
也就是当前的线程不是此对象监视器的所有者。也就是要在当前线程锁定对象,才能用锁定的对象此行这些方法,需要用到synchronized ,锁定什么对象就用什么对象来执行
notify(), notifyAll(),wait(), wait(long), wait(long, int)操作,否则就会报IllegalMonitorStateException异常。
例如 :
exapmle 1,锁定方法所属的实例对象:
public synchronized void method(){
    //然后就可以调用:this.notify()...
    //或者直接调用notify()...
}
exapmle 2,锁定方法所属的实例的Class:
public Class Test{
public static synchronized void method(){
    //然后调用:Test.class.notify()...
}
}
exapmle 3,锁定其他对象:
public Class Test{
public Object lock = new Object();
public static void method(){
    synchronized (lock) {
     //需要调用 lock.notify();
    }
}
}

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
就是说   你非要在线程A里面 操作线程B的锁  报这这错  明白了没  
回复 使用道具 举报
zhohao 发表于 2014-6-30 08:24
非常感谢,继续学习中。

嗯,加油小伙伴
回复 使用道具 举报
张益达 发表于 2014-6-30 12:52
抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监 ...

谢谢,十分详尽的答案。努力学习中
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马