理解IllegalMonitorStateException异常的抛出原因

[size=medium]在学习中有时会出现wait()方法抛 IllegalMonitorStateException 的情况,查阅wait 方法的API时,对于 IllegalMonitorStateException 的说明如下:
[/size]
[quote] [color=darkblue]IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。[/color] [/quote]
[size=medium]
从网上找来一段,自己改了改想了想,不敢说绝对正确,但确是自己的心得和理解(若有不正确的地方,恳请各位大侠指正吧...)[/size]

以下代码抛IllegalMonitorStateException


class M018
{
public static void main(String[] args) throws Exception
{
M018 m18 = new M018();
m18.one();
}

public void one() throws Exception
{
Object obj = new Object();
synchronized (Thread.currentThread())
{
obj.wait();//当前线程是主线程(所有者是Object)
//obj.notify();
}
}
}


/**
*2010-3-26 下午23:30:59
*Conclusion:
IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
*/

上例中,synchronized的对象是Thread.currentThread(),查阅currentThread()的说明如下:
[quote][color=darkblue]static Thread currentThread()
返回对当前正在执行的线程对象的引用。[/color] [/quote]

因为,Thread.currentThread()返回的当前线程的引用与当前线程,指向的是不同对象.

请看如下代码:

import static java.lang.System.out;
class M019
{
public static void main(String[] args)
{
One o = new One();
Thread o1 = new Thread(o);
Thread o2 = o.getThread();
//o1.start();//将此行注释去除,执行正常
//o2.start();//将此行注释去除,抛IllegalMonitorStateException
if(o1==o2)
out.println("equals");
else
out.println("Not equals");
if(o1.equals(o2))
out.println("equals");
else
out.println("Not equals");
}
}

class One implements Runnable
{
public void run()
{
for(int i = 0; i < 10 ; i++)
{
out.print(i+" ");
}
}

public Thread getThread()
{
return Thread.currentThread();
}
}

/**
*2010-3-26 下午23:58:59
*Conclusion:
*/


1.比较引用与equals方法都将返回Not equals
2.在上例中,之所以没有重写equals方法的原因是,Object对equals方法的定义如下:

public boolean equals(Object obj) {
return (this == obj);


所以没有必要重写.


以下代码进入wait状态,退出时按Ctrl+c,但是不抛IllegalMonitorStateException异常.

//
import static java.lang.System.out;
class M018
{
public static void main(String[] args) throws Exception
{
M018 m18 = new M018();
m18.one(m18);
//System.out.println("Hello World!");
}

public void one(M018 n) throws Exception
{
Object obj = new Object();
synchronized (this)
{
n.wait();
}
}
}


/**
*2010-3-26 下午23:30:59
*Conclusion:
IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
*/



[size=medium]总结如下:
[color=blue]非当前线程的引用调用wait方法,抛IllegalMonitorStateException异常[/color][/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值