java中wait()方法的一点总结

Java wait() 使用详解
本文详细解析了Java中wait()方法的正确使用方式,并通过示例说明了如何避免IllegalMonitorStateException异常的发生。文章强调了wait()和notify()方法必须在同步代码块中使用,并且调用这些方法的对象必须拥有该同步块的锁。

代码如下:

class Test{
    public static void get(){
        new Thread(){
            wait();
            System.out.print("hello world!");
        };
    }
}

在代码中,当因一些原因使用wait()时,抛出IllegalMonitorStateException,查询后发现wait()和notify()方法必须在同步代码块中使用,然后为在方法上使用了synchronized关键字.更改如下:

        public static synchronized get(){
        .......
        wait();
        ........
        }

结果依然抛出IllegalMonitorStateException,接着又去百度,查看API,后来发现原因是:

        抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程

从该解释中可以知道:

        1.使用该方法的时候必须在同步块(方法中),因为它始终和对象监视器绑定在一起.
        2.调用该方法的对象必须是该同步块(方法)监视器的所有者.

以上代码中,wait()方法的调用者是new Thread(){};匿名内部类,而同步方法时静态的,所以监视器所有者是Test.class;如果方法时非静态的,则监视器所有者是Test类的实例对象(this).所以不满足上面第2条,抛出异常. 正确的做法之一是:

    public static get(){
        Object obj = new Object();
        .......
        synchronized(obj){
            obj.wait();
        } 
        ........
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值