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!