有谁知道为什么我得到这个IllegalMonitorStateException?

got*_*ch4 5 java concurrency

我有一个集成测试,启动getty,然后它启动一个Web应用程序.Web应用程序将跨越一些将运行初始化任务的异步线程.之后就可以进行测试了.现在,因为我要等待其中一个任务完成,我想把静态监视器放在共享类中:

private static Object bootstrapDone = new Object();
Run Code Online (Sandbox Code Playgroud)

使用以下访问方法:

public static void signalEsBoostrapCompleted(){
    synchronized (bootstrapDone){
        bootstrapDone.notifyAll();
    } 
}

public static void waitEsBoostrapCompleted() throws InterruptedException {
    synchronized (bootstrapDone){
        bootstrapDone.wait(20000);
    } 
}
Run Code Online (Sandbox Code Playgroud)

如果我在测试中运行它,我会得到:java.lang.Object.notifyAll(Native Method)中的线程"Thread-11"java.lang.IllegalMonitorStateException异常

从notifyAll所在的行.我不知道为什么会这样.有人可以帮忙吗?

Tim*_*eau 2

bootstrapDone我能想到的唯一明显的方法是:在调用synchronized(bootstrapDone)和 调用之间,有东西正在改变另一个线程上的值bootstrapDone.notifyAll()

进行bootstrapDone最终处理后,任何无法再编译的内容都可能是罪魁祸首。