Maison >Java >javaDidacticiel >Pourquoi est-ce que j'obtiens une IllegalMonitorStateException lors de l'utilisation de « wait() » en Java ?

Pourquoi est-ce que j'obtiens une IllegalMonitorStateException lors de l'utilisation de « wait() » en Java ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-03 02:49:09766parcourir

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

Surmonter IllegalMonitorStateException pendant l'attente du thread

Le multithreading en Java offre un mécanisme puissant pour l'exécution simultanée de tâches. Cependant, il arrive parfois que les développeurs rencontrent l'erreur « IllegalMonitorStateException » lorsqu'ils tentent d'utiliser la méthode wait(). Cette erreur se produit lorsqu'un thread tente d'attendre un objet sans détenir son verrou.

Solution

Pour éviter l'IllegalMonitorStateException, vous devez vous assurer que le thread actuel détient l'exception IllegalMonitorStateException. verrouillez l'objet que vous comptez attendre. Vous pouvez y parvenir en encapsulant l'appel wait() dans un bloc synchronisé :

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

En acquérant le verrou sur l'objet avant d'appeler wait(), vous enregistrez essentiellement le thread pour être averti lorsque le l'état de l'objet change. Sans maintenir le verrou, le thread n'a pas la permission d'attendre sur l'objet.

Considération pour les packages de concurrence

Il convient de noter que les packages de concurrence Java, introduits dans Java 5 fournit des options plus robustes et conviviales pour la synchronisation des threads par rapport aux mécanismes plus anciens comme wait(). Ces packages proposent des classes comme ReentrantLock et CountDownLatch qui offrent plus de contrôle et de flexibilité. Par exemple, utiliser ReentrantLock pour protéger une condition d'attente ressemblerait à :

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
    }
}

En utilisant les packages de concurrence, vous pouvez simplifier votre code de thread tout en garantissant que la synchronisation est gérée correctement, réduisant ainsi le risque de rencontrer des erreurs telles que l'IllegalMonitorStateException.

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