5

特定のサービスが開始されたことをシステムのいくつかのセクションに通知するブール値が必要です。

奇妙な理由で、エラーが発生していますjava.lang.IllegalMonitorStateException: object not locked by thread before notifyAll()

奇妙なのは、notifyAll() が、notifyAll() を呼び出したオブジェクトを制御する同期ブロック内にあることです。

私のクラスは次のように始まります:

public class MyService {

    public static Boolean notifier = Boolean.valueOf(false);

    @Override
    public void start() {
        synchronized (MyService.notifier) {
            MyService.notifier = Boolean.valueOf(true);
            MyService.notifier.notifyAll();
        }
    }

    @Override
    public void stop() {
        synchronized (MyService.notifier) {
            MyService.notifier = Boolean.valueOf(false);
            MyService.notifier.notifyAll();
        }
    }
    ...
}

私はアンドロイドアプリケーションに取り組んでいます。何にも影響を与えるべきではないと思いますが、Javaの動作に影響を与える場合に備えて、そのコメントで質問を補足しています。

オブジェクトが同期ブロック内でロックされている場合、例外が発生するのはなぜですか?

4

1 に答える 1

17

この線

MyService.notifier = Boolean.valueOf(true);

ロックしているオブジェクトをスワップアウトすると、変数が新しいオブジェクトへの参照で上書きされます。したがって、ブロックに入ったときにロックを取得したオブジェクトは、呼び出しているオブジェクトと同じではありませんnotifyAll。呼び出されているオブジェクトのロックを取得していないことは誰もが知っていますnotifyAll。これは、同期ブロックが入力された後に作成された新しいオブジェクトです。

すべてのスレッドが同じロックを使用している必要があります。イアン・ロバーツが言ったように、ロックはオブジェクトに属しています。オブジェクトを上書きすると、新しいロックが作成されます。

于 2012-12-28T17:49:07.210 に答える