Maison >Java >javaDidacticiel >Pourquoi est-ce que j'obtiens une IllegalMonitorStateException lors de l'utilisation de « wait() » en 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!