异常(二):illegalMonitorStateException异常

本文详细解释了Java中wait、notify和notifyAll方法的使用,强调它们必须在同步上下文中调用,否则会抛出IllegalMonitorStateException。示例代码展示了如何在对象锁和类锁上正确使用这些方法,同时阐述了Java中每个类和对象都具有同步锁的概念。
摘要由CSDN通过智能技术生成

1、wait()、notify()、notifyAll()使用说明

wait()、notify()和notifyAll()必须在同步方法或同步代码块里调用【synchronized】。

如果在非同步方法或代码块里调用这些方法,程序能够通过编译,但在运行时,将产生IllegalMonitorState异常,并伴随着一些含糊的消息,比如"当前线程不是拥有者"。消息的意思是,调用wait(),notify()和notifyAll()的线程在调用这些方法前必须"拥有"对象的锁。当前的线程不是此对象锁的所有者,却调用该对象的notify(),notify(),wait()方法时抛出该异常。

2、API定义

意思就是说抛出这个异常表明线程尝试等待一个对象的监视器或者去通知其他正在等待这个对象监视器的线程时,但是没有拥有这个监视器的所有权。

3、Java中每个类和对象都有一个同步锁

Java中每个类和对象都有一个同步锁,只有获取到调用同步锁,调用wait和notify方法才行

1 调用所属对象的wait和notify方法

public class Test3 {
    
    //所属对象
    public synchronized void waitSelf(){
        try {
            this.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public synchronized void notifySelf(){
        this.notify();
    }
    
    //其他对象
    public Object lock = new Object();
    
    public void waitObject(){
        synchronized (lock){
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    public void notifyObject(){
        synchronized(lock){
            lock.notify();
        }
    }
}

2 调用类的notify和wait方法

public class Test3 {


    public static synchronized void notifyClass() {
        Test3.class.notify();
    }
    
    public void waitClass() {
        synchronized (Test3.class) {
            try {
                Test3.class.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

把API中所说的监视器(monitor)理解成同步锁。想要执行某个对象的notify(), notifyAll(),wait(), wait(long), wait(long, int)方法就必须获取该对象的锁,需要使用synchronized,不然就会抛出IllegalMonitorStateException异常。
 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值