1、异常原因及解释

首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:
1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;
2>当前线程不含有当前对象的锁资源的时候,调用obj.notify()方法。
3>当前线程不含有当前对象的锁资源的时候,调用obj.notifyAll()方法。

java.lang.IllegalMonitorStateException是在调用object的wait和notify,notifyAll方法的时候可能会出现的异常。 在调用上述三个方法的时候,线程必须获得该对象的对象级别锁,换句话说,出现这个异常的原因是因为,调用wait和notify,notifyAll的对象没有在同步方法(synchronized修饰的方法)或者同步代码块(synchronized(x){})中。

wait()和notify()方法的调用必须具有内置锁 synchronized(this) 的代码块内或同步方法才能调用,否则就会报该错误。

如果用了显式锁 Lock 就不要用 wait() 和 notify() 了,它们是两套加锁机制,不能混着用的。

2、对象级别加锁

想要获取该对象的对象级别锁,即直接调用Object对象的上述三个方法,也就只有在同步方法或同步代码块中。(同步方法或同步代码块以当前对象this作为同步监视器)。

3、调用某个对象的wait方法

如果要调用某个对象的wait方法,那么必须这么调用:

Object lock = new Object();
 synchronized(lock){
 lock.wait();
 } 如果是
Object lock = new Object();
synchronized(lock){
this.wait();
}
报错

4、举例

 package com.asd.reserve.pojo.thread;

 /**
* @author zs
* @date 2019/11/15 14:37
*/
public class MyThread31 extends Thread
{
private Object lock; public MyThread31(Object lock)
{
this.lock = lock;
} public void run() {
ThreadDomain31 td = new ThreadDomain31();
td.testMethod(lock);
} public static void main(String[] args)
{
Object lock = new Object();
MyThread31 mt0 = new MyThread31(lock);
MyThread31 mt1 = new MyThread31(lock);
mt0.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
mt1.start();
}
} package com.asd.reserve.pojo.thread; /**
* @author zs
* @date 2019/11/15 14:37
*/
public class ThreadDomain31 {
public void testMethod(Object lock)
{
try
{
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + " Begin wait()");
//lock.notify();
//Thread.sleep(1000);
lock.wait();
Class<? extends ThreadDomain31> aClass = this.getClass();
String name = aClass.getName();
//super.wait();//调用此方法时,就会抛出该异常,因为当前的锁资源是lock。改成synchronized (this)可调用
System.out.println(Thread.currentThread().getName() + " End wait");
//lock.notify();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}

(四)关于java.lang.IllegalMonitorStateException异常说明的更多相关文章

  1. 关于java.lang.IllegalMonitorStateException异常说明(四)

    1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...

  2. Java中线程出现Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 解决方法

    代码 package thread; public class TestChongNeng { public static void main(String[] args) { Thread t1 = ...

  3. java.lang.IllegalMonitorStateException异常

    转自:https://blog.csdn.net/qianshangding0708/article/details/48290937

  4. 并发 错误 java.lang.IllegalMonitorStateException: current thread not owner 分析

    public class ThreadTest implements Callable<String> { public String call() throws Exception { ...

  5. (原创)Java多线程作业题报java.lang.IllegalMonitorStateException解决

    作业: 有一个水池,水池容量500L,一边为进水口,一边为出水口,要求进水放水不能同时进行,水池一旦满了不能继续注水,一旦空了,不能继续放水,进水速度5L/s,放水速度2L/s. 这是我学多线程时做的 ...

  6. ReentrantLock$Sync.tryRelease java.lang.IllegalMonitorStateException

    早上一来,例行性的看主要环境的运行情况,发现有个环境中有如下异常: 17-02-28 08:13:37.368 ERROR pool-2-thread-65 com.ld.net.spider.Spi ...

  7. Java之java.lang.IllegalMonitorStateException

    今天又中彩了, 原本很简单的多线程程序, 蓦然间冒了个"java.lang.IllegalMonitorStateException" , 杀了个措手不及. 一直纳闷, 为什么为什 ...

  8. getActionBar().setTitle(); Java.lang.NullPoint异常解决方案

    getActionBar().setTitle(); Java.lang.NullPoint异常解决方案,是由于低版本不支持直接获取的缘故,修改方案: try changing your theme ...

  9. response.sendRedirect 报 java.lang.IllegalStateException 异常的解决思路

    今天在进行代码开发的时候,出现了 java.lang.IllegalStateException异常,response.sendRedirect("./DEFAULT.html") ...

随机推荐

  1. 解决java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

    解决java.lang.SecurityException: Invalid signature file digest for Manifest main attributes 当项目依赖其他jar ...

  2. shell中得到当下路径所有文件夹名称

      方法1: for dir in $(ls -al ./|awk '/^d/ {print $NF}') do echo $dir done   方法2: for dir in $(ls ./) d ...

  3. windows下使用命令行编译、链接C++源文件

    目录 1.流程 2.操作 1.流程 .cpp-->.o-->.exe 分别为 源文件-->中间目标文件-->可执行文件 两个-->的过程分别为编译.链接 p.s.多个 . ...

  4. [CF1010D]Mars Over_位运算性质

    Mars rover 题目链接:http://codeforces.com/problemset/problem/1010/D 数据范围:略. 题解: 因为每次只改一个,改完之后改回去,这个性质很重要 ...

  5. mybatis 的一对一关联查询association

    现在项目的列表查询数据需要查一个总数count, 如果直接写在同一个sql里面,会导致查询速度很慢, 因此,想到使用关联查询,例子如下: 附上代码: 其中遇到的坑哟: 1.association中的s ...

  6. Win7 Eclipse 搭建spark java1.8(lambda)环境:WordCount helloworld例子

    [学习笔记] Win7 Eclipse 搭建spark java1.8(lambda)环境:WordCount helloworld例子 lambda表达式是java8给我们带来的一个重量的新特性,借 ...

  7. 关于使用pietty或putty终端连接ubuntu虚拟机时报被拒绝连接问题

    首先如果要使用终端进行远程连接的ubuntu虚拟机的话,必须保证其虚拟机ip能在window下ping的动.具体的ubuntu网络配置这里不再讲,我这里使用的是NAT连接. 然后检查ssh服务是否有安 ...

  8. 火狐 , IE , 谷歌浏览器的 驱动下载地址汇总

    一.Firefox和驱动下载地址 所有火狐浏览器版本下载地址:http://ftp.mozilla.org/pub/firefox/releases/ 所有火狐驱动geckodriver版本下载地址: ...

  9. Java建造者模式(思维导图)

    图1 建造者模式[点击查看大图] 基本的知识点已在思维导图中,下面是demo 1,Builder 为创建一个产品对象的各个部件指定抽象接口 public interface PersonBuilder ...

  10. MyEclipse Derby 这么玩

    首先得把MYECLIPSE自带的JDK的DERBY数据库的JAR文件给导入工程,反正没事把几个都导进来,如下: derby.jar,derbyclient.jar,derbynet.jar,derby ...