zl程序教程

您现在的位置是:首页 >  后端

当前栏目

IllegalMonitorStateException 异常 与 Java中的"对象监视器Monitor"和"对象锁"详解

JAVA异常对象 详解 quot 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虚拟机中&