java.lang.IllegalMonitorStateException的问题

海盗船长4.0 2016-04-21 08:59:08

public void run() {
synchronized(obj){
System.out.println(Thread.currentThread().getName()+" in...");
while(true){
try {
obj.wait(100);
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+".............");
} catch (InterruptedException e) {
}
}
}
}

Test t=new Test();

Thread t1=new Thread(t,"t1");
Thread t2=new Thread(t,"t2");

t1.start();
t2.start();

2个线程都将在while里一直执行wait,但是他们都没有持有obj的锁,为什么不抛IllegalMonitorStateException,
wait方法不是必须要有对象的监听才行么
...全文
398 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
海盗船长4.0 2016-04-22
  • 打赏
  • 举报
回复
引用 1 楼 rickylin86 的回复:

synchronized(obj){
这句代码已经指明了你是在obj对象上做同步.那么调用obj.wait()方法肯定不会有IllegalMonitorStateException异常啦.
但是锁确实是被释放了啊,那段代码还是没有持有obj的锁啊,这个异常也不是检查异常啊
rickylin86 2016-04-22
  • 打赏
  • 举报
回复

synchronized(obj){
这句代码已经指明了你是在obj对象上做同步.那么调用obj.wait()方法肯定不会有IllegalMonitorStateException异常啦.
rickylin86 2016-04-22
  • 打赏
  • 举报
回复

public class Test{
	public static void main(String[] args)throws Exception{
		Object obj = new Object();
		obj.wait();
	}
}
类似这样的情况才会抛出IllegalMonitorStateException异常.当你执行同步代码块的对应的对象并和调用wait方法同一个对象时候会抛出.你代码上的两个线程都是基于obj对象同步的.所以在同步代码块中可以调用obj.wait().一进入同步代码块就相当于加对应同步对象的锁.遇到wait时候跳出交给其他对应该对象同步的其他线程.所以两个线程都一直等待.并不会抛出你说的那个异常.
rickylin86 2016-04-22
  • 打赏
  • 举报
回复
当你执行同步代码块的对应的对象并和调用wait方法同一个对象时候会抛出

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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