在学习中有时会出现wait()方法抛 IllegalMonitorStateException 的情况,查阅wait 方法的API时,对于 IllegalMonitorStateException 的说明如下:
引用
IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
从网上找来一段,自己改了改想了想,不敢说绝对正确,但确是自己的心得和理解(若有不正确的地方,恳请各位大侠指正吧...)
以下代码抛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()的说明如下:
引用
static Thread currentThread()
返回对当前正在执行的线程对象的引用。
因为,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 - 如果当前线程不是此对象监视器的所有者。
*/
总结如下:
非当前线程的引用调用wait方法,抛IllegalMonitorStateException异常
分享到:
相关推荐
sleep()与wait()的区别 1.这两个方法来自不同...(如果不是在同步方法或同步代码块中调用wait()方法,则抛出IllegalMOnitorStateException,它是RuntimeException的一个子类,因此,不需要try-catch语句进行捕捉异常)
java并发包详解,condition重入锁;Semaphore信号量;ReadWriteLock读写锁;CountDownLatch计时器;...会得到⼀个java.lang.IllegalMonitorStateException异常,反之,如果释放锁的次数少,那么相当 于线程还持有这个锁
wait方法如果不是同步监视器去调用的话会报IllegalMonitorStateException异常 如果没有线程处于wait状态,调用notify此时是一个空唤醒 stringBuffer中的同步方法,都是非静态的,因为共用一个this锁就可以了,线程...
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...
想必大家都有参加过面试的或多或少的经历吧,不知道考官... DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ......
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法...
但是由于某种原因,我无法在新的新项目中重现它-试图找出有什么特别的地方... tasks.addRule("integrationTestFor-<SampleName>") { String taskName -> if (taskName.startsWith("integrationTestFor-")) { tasks....
生产者消费者详解wait():执行该方法的线程对象,释放同步锁,JVM会把该线程放到等待池中,等待其他线程唤醒该线程 notify():执行该方法的线程唤醒在等待池中等待的任意一个... java.lang.IllegalMonitorStateException
如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的...
Exception Float Font Form 容器类:能显示从Item派生的类 GameCanvas Gauge 显示图形化的进度条 ... IllegalMonitorStateException IllegalStateException IllegalThreadStateException
rule.findbugs.IMSE_DONT_CATCH_IMSE.name=不良实践 - 捕获可疑IllegalMonitorStateException rule.findbugs.BX_BOXING_IMMEDIATELY_UNBOXED.name=性能 - 基本类型包装之后立刻解包 rule.findbugs.IJU_SETUP_NO_...