IllegalMonitorStateException 异常 与 Java中的"对象监视器Monitor"和"对象锁"详解
2023-09-14 09:07:23 时间
异常解析
在线程中调用wait方法的时候要用synchronized锁住对象,确保代码段不会被多个线程调用。
如果没有synchronized加锁,那么当前的线程不是此对象监视器的所有者, 就会抛出 IllegalMonitorStateException 异常信息。
当前线程要锁定该对象之后,才能用锁定的对象执行这些方法,这里需要用到synchronized关键字,锁定哪个对象就用哪个对象来执行 notify(), notifyAll(),wait(), wait(long), wait(long, int) 操作,否则就会报IllegalMonitorStateException异常。
在JVM中,每个对象和类在逻辑上都是和一个监视器相关联的。为了实现监视器的排他性监视能力,JVM为每一个对象和类都关联一个锁。锁住了一个对象,就是获得对象相关联的监视器。
监视器好比一做建筑,它有一个很特别的房间,房间里有一些数据,而且在同一时间只能被一个线程占据,进入这个建筑叫做"进入监视器",进入建筑中的那个特别的房间叫做"获得监视器",占据房间叫做"持有监视器",离开房间叫做"释放监视器",离开建筑叫做"退出监视器"。
而一个锁就像一种任何时候只允许一个线程拥有的特权。一个线程可以允许多次对同一对象上锁.对于每一个对象来说,java虚拟机维护一个计数器,记录对象被加了多少次锁,没被锁的对象的计数器是0,线程每加锁一次,计数器就加1,每释放一次,计数器就减1.当计数器跳到0的时候,锁就被完全释放了。
Java虚拟机中的一个线程在它到达监视区域开始处的时候请求一个锁.JAVA程序中每一个监视区域都和一个对象引用相关联. 在java中,synchronized是唯一实现同步的东西。
Java对象的组成与锁的状态
HotSpot虚拟机中&
相关文章
- 【异常】Caused by: java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0
- mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
- java面向对象高级分层实例_接口类
- Java实现 LeetCode 137 只出现一次的数字 II(二)
- Java实现字母去重
- Java中Vector类的常用方法
- [Java]Axis需要高版本的J2sdk: j2sdk-1_4_2_08
- Java异常捕获之try-catch-finally-return的执行顺序-转载
- Java知识回顾 (6)正则表达式、方法、文件与异常
- Java 异常体系(美团-滴滴面试)
- Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换
- Atitit.跨语言异常转换机制 java c# php到js的异常转换
- Atititjs javascript异常处理机制与java异常的转换.js exception process
- Atitit. 异常的使用总结最佳实践java .net php Vo8f
- 【异常】has been compiled by a more recent version of the Java Runtime (class file version 55.0)
- java.util.ConcurrentModificationException 异常解决的方法及原理
- 每天一点点java---继承exception类来实现自己的异常类
- Java开发之高并发必备篇(六)——Lock和ReentrantLock(1)
- Java 的数组
- Java基础系列-Collector和Collectors
- Java容器解析——HashMap