ホームページ >Java >&#&チュートリアル >Java で「wait()」を使用すると IllegalMonitorStateException が発生するのはなぜですか?

Java で「wait()」を使用すると IllegalMonitorStateException が発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-03 02:49:09797ブラウズ

Why Do I Get an IllegalMonitorStateException When Using `wait()` in Java?

スレッド待機中の IllegalMonitorStateException の克服

Java のマルチスレッドは、タスクの同時実行のための強力なメカニズムを提供します。ただし、開発者が wait() メソッドを使用しようとすると、「IllegalMonitorStateException」エラーが発生することがあります。このエラーは、スレッドがロックを保持せずにオブジェクトを待機しようとすると発生します。

解決策

IllegalMonitorStateException を回避するには、現在のスレッドがロックを保持していることを確認する必要があります。待機するオブジェクトをロックします。これは、同期ブロック内に wait() 呼び出しをカプセル化することで実現できます。

synchronized (object) {
    object.wait();
}

wait() を呼び出す前にオブジェクトのロックを取得することで、基本的に、オブジェクトのロックが解除されたときに通知を受けるスレッドを登録することになります。オブジェクトの状態が変化します。ロックを保持しない場合、スレッドにはオブジェクトを待機する権限がありません。

同時実行パッケージに関する考慮事項

で導入された Java 同時実行パッケージは注目に値します。 Java 5 では、wait() などの古いメカニズムと比較して、スレッド同期のためのより堅牢でユーザーフレンドリーなオプションが提供されます。これらのパッケージは、より多くの制御と柔軟性を提供する ReentrantLock や CountDownLatch などのクラスを提供します。たとえば、ReentrantLock を使用して待機条件を保護すると、次のようになります。

ReentrantLock lock = new ReentrantLock();

void waitMethod() {
    lock.lock(); // Acquire lock
    try {
        lock.wait(); // Wait while holding lock
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        lock.unlock(); // Release lock
    }
}

void notifyMethod() {
    lock.lock(); // Acquire lock
    try {
        lock.notify(); // Notify waiting thread
    } finally {
        lock.unlock(); // Release lock
    }
}

同時実行パッケージを使用すると、同期が正しく処理されるようにしながらスレッド コードを簡素化し、次のようなエラーが発生する可能性を減らすことができます。 IllegalMonitorStateException.

以上がJava で「wait()」を使用すると IllegalMonitorStateException が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。