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

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

Barbara Streisand
Libérer: 2024-11-02 10:13:30
original
566 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal