`

理解IllegalMonitorStateException异常的抛出原因

阅读更多
在学习中有时会出现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异常
0
1
分享到:
评论

相关推荐

    sleep()、wait()、yield()和join()方法特点及区别.docx

    sleep()与wait()的区别 1.这两个方法来自不同...(如果不是在同步方法或同步代码块中调用wait()方法,则抛出IllegalMOnitorStateException,它是RuntimeException的一个子类,因此,不需要try-catch语句进行捕捉异常)

    java—多线程的通信、生产者与消费者模式

    wait方法如果不是同步监视器去调用的话会报IllegalMonitorStateException异常 如果没有线程处于wait状态,调用notify此时是一个空唤醒 stringBuffer中的同步方法,都是非静态的,因为共用一个this锁就可以了,线程...

    java 面试题 总结

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...

    java面试题全攻略,几乎包罗全部面试过程中可能遇到的问题

    想必大家都有参加过面试的或多或少的经历吧,不知道考官... DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ......

    超级有影响力霸气的Java面试题大全文档

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。  Servlet被服务器实例化后,容器运行其init方法...

    AGP-80464216:Android Gradle插件错误80464216

    但是由于某种原因,我无法在新的新项目中重现它-试图找出有什么特别的地方... tasks.addRule("integrationTestFor-&lt;SampleName&gt;") { String taskName -&gt; if (taskName.startsWith("integrationTestFor-")) { tasks....

    锁、生产者与消费者.pdf

    生产者消费者详解wait():执行该方法的线程对象,释放同步锁,JVM会把该线程放到等待池中,等待其他线程唤醒该线程 notify():执行该方法的线程唤醒在等待池中等待的任意一个... java.lang.IllegalMonitorStateException

    JAVA面试题最全集

    如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的...

    移动开发文档

     Exception Float  Font  Form 容器类:能显示从Item派生的类  GameCanvas  Gauge 显示图形化的进度条 ... IllegalMonitorStateException  IllegalStateException  IllegalThreadStateException

    Findbugs 缺陷详解与英文代号的对照表

    rule.findbugs.IMSE_DONT_CATCH_IMSE.name=不良实践 - 捕获可疑IllegalMonitorStateException rule.findbugs.BX_BOXING_IMMEDIATELY_UNBOXED.name=性能 - 基本类型包装之后立刻解包 rule.findbugs.IJU_SETUP_NO_...

Global site tag (gtag.js) - Google Analytics