此代码可以抛出IllegalMonitorStateException

时间:2012-11-27 19:22:35

标签: java multithreading exception locking synchronized-block

void waitForSignal(){
    Object ob =new Object();

    synchronized (Thred.currentThread()) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

此方法引发IllegalMonitorStateException。有人可以解释原因。

提前致谢

3 个答案:

答案 0 :(得分:4)

您应该只对已获得锁定的对象调用wait

在您的代码中,您已在Thread.currentThread()上获得锁定,但您在ob上调用它,这将引发IllegalMonitorStateException

因此,您应该将同步块更改为: -

synchronized (ob) {

}

答案 1 :(得分:1)

您想要同步您正在等待的对象:

synchronized (ob) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

答案 2 :(得分:0)

如果您使用IllegalMonitorException(例如

)修复了问题
void waitForSignal() {
    Object ob = new Object();
    synchronized (ob) {

您的代码无效。在您的代码中,每个线程都会创建一个新的锁,在方法外部不可见。其他线程没有机会通知等待的线程。