有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java IllegalMonitorStateException

无论何时调用wait()和notify()或notifyAll(),我都会得到一个非法的MonitorStateException。javadoc说,如果我的线程“试图等待一个对象的监视器,或者通知其他线程在没有拥有指定监视器的情况下等待一个对象的监视器,那么我应该得到这个异常。”

然而,这里有一个代码示例,我在其中调用上述方法

//note that doSomething will be called by a thread from another class, not this one
public void doSomething(){
    while(objectsCurrentlyDoingSomething() >= thisClass'sCapacity){
         synchronized(objectLock){ //objectLock is created at top of class like this:
             wait(2000);           //private static final Object objectLock = new Object();
         }
    }

    //rest of code
}

然后,稍后我会释放一个线程来保持该锁,并说如果对象完成,将减少当前使用的对象数并通知()

....object finished......
synchronized(objectLock){
    notify();
}

共 (2) 个答案

  1. # 1 楼答案

    您需要调用wait,并在objectLock上通知

    例如

    objectLock.wait()

    你只需要调用wait()你就是在this上调用它

  2. # 2 楼答案

    正如z5h所指出的,对wait()和notify()的调用应该在objectLock对象上进行:

    //note that doSomething will be called by a thread from another class, not this one
    public void doSomething(){
        while(objectsCurrentlyDoingSomething() >= thisClass'sCapacity){
             synchronized(objectLock){ //objectLock is created at top of class like this:
                 objectLock.wait(2000);           //private static final Object objectLock = new Object();
             }
        }
    
        //rest of code
    }
    

    ....object finished......
    synchronized(objectLock){
        objectLock.notify();
    }