2013-10-14 17 views
5

私はgettyを起動する統合テストを持っていて、それが順番にWebアプリケーションを起動します。 Webアプリケーションは、初期化タスクを実行するいくつかの非同期スレッドにまたがります。その後、テストする準備が整いました。以下のアクセサメソッドを持つ誰かがなぜ私はこのIllegalMonitorStateExceptionを取得している知っていますか?

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); 
    } 
} 

私はでこれを実行する場合私が手にテスト:のnotifyAllがある行からのスレッドで 例外java.lang.Object.notifyAllで「スレッド-11」java.lang.IllegalMonitorStateException (ネイティブメソッド)

。なぜこれが起こっているのか分かりません。 誰も助けることができますか?

+1

あなたはいつでも 'bootstrapDone'の値を変更していますか? (私は変数を最終的にすることを提案したい...) –

+3

何かによって再割り当てされたブートストラップは終了しましたか?そうでない場合でも、それを「最終的」にするべきです。ロックするために特別に作成するオブジェクトは、通常は定数(つまり「最終」)である必要があります。 – Dev

+0

実際にはそうですが、テストをすばやく書き込もうとしていました。 – gotch4

答えて

2

私はそれが考えられる唯一の明白な方法は:synchronized(bootstrapDone)への呼び出しとbootstrapDone.notifyAll()の呼び出しの間に、何かが別のスレッドでbootstrapDoneの値を変更していることです。

最終的にbootstrapDoneとなり、コンパイルできなくなったものが原因である可能性があります。

+0

実際、それによって参照されるオブジェクトを変更するコードがありました。それを最終的にすることで、私はそれを簡単に見つけることができました。ありがとう。 – gotch4

関連する問題