wait()、notify() 、notifyAll() の呼び出しのうち、対応する同期ステートメントまたは同期メソッド内で行われていないものを報告します。
あるオブジェクトに対してロックを保持せずにそのオブジェクトに対してこれらのメソッドを呼び出すと、IllegalMonitorStateException が発生します。
このようなコンストラクトは必ずしも間違いではありませんが、一度確認することをおすすめします。含んでいるメソッドが呼び出される前に必要なロックが取得される可能性があるためです。
例:
class Sync {
private final Object lock = new Object();
void test() throws InterruptedException {
synchronized (this) {
lock.wait(); // 'lock.wait()' は 'lock' で同期されません
}
}
}