Maison  >  Article  >  Java  >  Comment éviter IllegalMonitorStateException lorsque vous utilisez wait() et notify() de Java ?

Comment éviter IllegalMonitorStateException lorsque vous utilisez wait() et notify() de Java ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 10:13:30449parcourir

How Do You Avoid IllegalMonitorStateException When Using Java's wait() and notify()?

Java Wait and Notify : Comprendre IllegalMonitorStateException

En Java, les méthodes wait() et notify() sont utilisées pour synchroniser les threads. Cependant, si elle est mal utilisée, l'IllegalMonitorStateException peut être rencontrée.

Problème

L'extrait de code ci-dessous illustre un simple problème de synchronisation :

<code class="java">class Main {
    // ...
    public void wait() {
        // ...
    }
    public void notifyAll() {
        // ...
    }
}

class Runner implements Runnable {
    public void run() {
        try {
            Main.main.wait();
        } catch (InterruptedException e) {
            // ...
        }
    }
}</code>

Dans cet exemple, le thread Runner tente d'appeler wait() sur l'objet Main. Cependant, cela conduit à une exception car le thread Runner ne possède pas le moniteur associé à l'objet Main.

Comprendre les méthodes synchronisées

Pour utiliser wait() et notifier (), le thread actuel doit posséder le moniteur de l'objet en cours de synchronisation. Ceci peut être réalisé en synchronisant sur l'objet à l'aide du mot-clé synchronisé.

Solution

Pour résoudre le problème, la classe Runner peut être modifiée comme suit :

<code class="java">class Runner implements Runnable {
    public void run() {
        try {
            synchronized(Main.main) {
                Main.main.wait();
            }
        } catch (InterruptedException e) {
            // ...
        }
    }
}</code>

En ajoutant le bloc synchronisé autour de l'appel wait(), le thread Runner devient propriétaire du moniteur de l'objet Main et peut effectuer l'opération d'attente en toute sécurité.

Application à notifyAll

Le même principe s'applique aux méthodes notify() et notifyAll(). Ils doivent être appelés depuis un bloc synchronisé de l'objet en cours de synchronisation. Par conséquent, la classe Main peut être modifiée comme suit :

<code class="java">class Main {
    // ...
    public synchronized void notifyAll() {
        // ...
    }
}</code>

En garantissant la bonne propriété des moniteurs, l'utilisation de wait() et notify() peut être implémentée en toute sécurité pour synchroniser les threads en Java.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn