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. Reactor系列(五)map映射

    #java# #reactor# #flux# #map# #映射# 视频解视: https://www.bilibili.com/video/av79179444/ FluxMonoTestCase ...

  2. nginx处理请求的11个阶段

    Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是 post-read.server-rewrite.find-config.rewrite.post-rewrite.preacc ...

  3. 六扇门团队作业 ——《DorMi宿舍管理系统需求分析》

    团队作业 --<需求分析> 一.格式描述 这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 六扇门 这个作业的目标 通过对用户 ...

  4. 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用

    资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...

  5. [转帖]K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)

    K8s 学习者绝对不能错过的最全知识图谱(内含 58个知识点链接)   https://www.cnblogs.com/alisystemsoftware/p/11429164.html 需要加强学习 ...

  6. 正式发布! .NET开发控件集ComponentOne 新版本加入Blazor UI

    近期,由葡萄城推出的ComponentOne .NET开发控件集正式发布最新版本! ComponentOne 是一套专注于企业 .NET开发.支持 .NET Core 平台,并完美集成于 Visual ...

  7. 【转载】Jave开发手册之正则表达式预编译

    今天又水一篇,java开发手册华山版 一.编程规约 (九)其它 第一条 解释:Pattern要定义为static final静态变量,以避免执行多次预编译. 错误用法: // 没有使用预编译 priv ...

  8. Docker 镜像的制作

        1.登录docker            docker ecex –it 容器名/容器id /bin/bash        例如:            docker exec –it t ...

  9. 【搜索】n的约数

    题目链接:传送门 [题解]: 考察dfs和质因数分解,首先开一个prime数组. 参数解释: 1.当前值的大小.[利用题目的n来控制范围] 2.控制下界,每次都是以某一个质数开始搜索, pos 3.控 ...

  10. github骚操作

    限制搜索 in关键词限制搜索范围 命令 说明 xxx in:name 项目名包含xxx的 xxx in:description 项目描述包含xxx的 xxx in:readme 项目的readme文件 ...