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

时间:2013-10-14 17:27:13

标签: java concurrency

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

private static Object bootstrapDone = new Object();

使用以下访问方法:

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

public static void waitEsBoostrapCompleted() throws InterruptedException {
    synchronized (bootstrapDone){
        bootstrapDone.wait(20000);
    } 
}

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

从notifyAll所在的行

。我不知道为什么会这样。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

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

bootstrapDone成为最终版,任何无法再编译的内容都可能是罪魁祸首。