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、举例

 1 package com.asd.reserve.pojo.thread;
2
3 /**
4 * @author zs
5 * @date 2019/11/15 14:37
6 */
7 public class MyThread31 extends Thread
8 {
9 private Object lock;
10
11 public MyThread31(Object lock)
12 {
13 this.lock = lock;
14 }
15
16 public void run() {
17 ThreadDomain31 td = new ThreadDomain31();
18 td.testMethod(lock);
19 }
20
21 public static void main(String[] args)
22 {
23 Object lock = new Object();
24 MyThread31 mt0 = new MyThread31(lock);
25 MyThread31 mt1 = new MyThread31(lock);
26 mt0.start();
27 try {
28 Thread.sleep(100);
29 } catch (InterruptedException e) {
30 e.printStackTrace();
31 }
32 mt1.start();
33 }
34 }
35
36 package com.asd.reserve.pojo.thread;
37
38 /**
39 * @author zs
40 * @date 2019/11/15 14:37
41 */
42 public class ThreadDomain31 {
43 public void testMethod(Object lock)
44 {
45 try
46 {
47 synchronized (lock) {
48 System.out.println(Thread.currentThread().getName() + " Begin wait()");
49 //lock.notify();
50 //Thread.sleep(1000);
51 lock.wait();
52 Class<? extends ThreadDomain31> aClass = this.getClass();
53 String name = aClass.getName();
54 //super.wait();//调用此方法时,就会抛出该异常,因为当前的锁资源是lock。改成synchronized (this)可调用
55 System.out.println(Thread.currentThread().getName() + " End wait");
56 //lock.notify();
57 }
58 }
59 catch (InterruptedException e)
60 {
61 e.printStackTrace();
62 }
63 }
64 }

关于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. 微信sdk上传图片大小1k,损坏的问题以及微信上传图片需要的配置

    微信公众号的appid和appsecret有问题,会导致上传图片大小为1k这个问题 微信上传图片需要设置公众号的'JS接口安全域名'

  2. WIN10安装并汉化PLSQL

    WIN10安装并汉化PLSQL 安装文件 链接:https://pan.baidu.com/s/12BBEaFQ8G5LztJmCKgnh1w 提取码:96nx 一.安装 1.双击plsqldev.e ...

  3. 流程自动化RPA,Power Automate Desktop系列 - 发布文档中心

    一.背景 内网中有一个基于VuePress搭建的静态文档中心,但是每次修改后都需要重新Build一次才行,之前都是手动执行命令,现在可以基于Power Automate Desktop来创建任务了. ...

  4. QPainter::begin: Paint device returned engine == 0, type: 1

    开始 使用QPainter画图,需要继承QWidget,重写paintEvent()虚函数,在里面进行绘图. 或者可以考虑绘制到QImage或者QPixmap上面,然后在paintEvent()里面调 ...

  5. 19、lnmp_mysql、nfs组件分离

    19.1.LNMP一体机的数据库分离成独立的数据库: 1.根据以上学习过的方法在db01服务器上安装独立的mysql数据库软件: 2.在web01服务器上导出原先的数据库: [root@web01 t ...

  6. 用“kill”命令来强制终结某个行为或失常的应用和命令

    ​       首先让我们先了解"kill"命令,无论你使用哪种操作系统,你一定会遇到某个行为失常的应用,它把自己锁死并拒绝关闭.在Linux(还有Mac),你可以用一个" ...

  7. mybatis 配置的log4j文件无效,不能正常显示日志信息

    正在学习mybatis,配置好后log4j.properties文件后,日志信息不能正常显示,没有效果. 查看了一下mybatis的相关文档,在日志一栏找到问题愿意 原因是我们的mybatis选了其他 ...

  8. 转:nginx服务器配置

    1. user www-data说明的是使用的用户,至于www-data这个用户是系统自带的,我们不用说系统里没有这个账户的,虽然这个账户具体是做什么的,我也不太清楚2.worker_processe ...

  9. leetcode第156场周赛5207

    当时做的时候,一直理解想搞dp,后面可能思路有点乱了,写不出来... 看了评论区的大佬,才发现是滑动窗口的题目,学习到了. 思路分析: 1.这题可以转化成求数组最大子数组的和不超过maxCost的长度 ...

  10. ROS2学习之旅(15)——编写简单的服务和客户节点(C++)

    当节点使用服务进行通信时,发送数据请求的节点称为客户节点,响应请求的节点称为服务节点.请求和响应的结构由.srv文件决定. 本文的例子是一个简单的整数加法系统:一个节点请求两个整数的和,另一个节点响应 ...