/ / IllegalMonitorStateException dans le code - java, multi-lecture, illégalmonitorstateexcep

IllegalMonitorStateException dans le code - java, multithreading, illégalemonitorstateexcep

class Test {

public static void main(String[] args) {

System.out.println("1.. ");
synchronized (args) {

System.out.println("2..");

try {
Thread.currentThread().wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("3..");
}

}
}

Je reçois IllegalMonitorStateException exception moniteur dans ce code. Selon ma compréhension, en raison de bloc synchronisé autour de args qui est un objet tableau de chaînes, le thread actuel doit avoir acquis le verrou et avec la méthode wait, je libère le verrou.

Quelqu'un peut-il m'expliquer la raison de cette exception?

Réponses:

4 pour la réponse № 1

Vous appelez wait() sur Thread.currentThread(). Avant d'appeler wait() sur n'importe quel objet, vous devez posséder le moniteur de cet objet, par le biais d’un bloc synchronisé synchronisant sur cet objet. Donc ce qui manque c'est

synchronized(Thread.currentThread()) {
Thread.currentThread().wait();
}

Cela dit, appeler wait() sur un objet Thread n'est pas quelque chose que vous devriez faire, et montre probablement que vous n'avez pas compris ce que wait() surtout si vous n’avez pas d’autre fil appelant notify() ou notifyAll(). La synchronisation sur les arguments passés à la méthode principale est également un choix très étrange. wait() est une méthode de très bas niveau qui devrait être rarement utilisée, même si vous comprenez parfaitement ce qu'elle fait. Pour une meilleure réponse, expliquez ce que vous voulez que ce code fasse.


3 pour la réponse № 2

De IllegalMonitorStateException Documentation

Lancé pour indiquer qu'un thread a tenté d'attendre sur le moniteur d'un objet ou pour notifier d'autres threads en attente sur le moniteur d'un objet sans posséder le moniteur spécifié

De Object#notify() Documentation

Un thread devient le propriétaire du moniteur de l’objet de l’une des trois manières suivantes:

  • En exécutant une méthode d'instance synchronisée de cet objet.
  • En exécutant le corps d'une instruction synchronisée qui se synchronise sur l'objet.
  • Pour les objets de type Classe, en exécutant une méthode statique synchronisée de cette classe.

Donc, puisque le thread exécute un bloc synchronisé sur args objet

synchronized (args) {
//...
}

tu devrais appeler args.wait() au lieu Thread.currentThread().wait(); .


0 pour la réponse № 3

Bonjour ankit, je suppose que vous essayez d’apprendre quelques notions de base du multithreading. essayez de vous procurer de bons tutoriels en ligne:http://www.javaworld.com/jw-04-1996/jw-04-threads.html

ou essayez un bon livre de base. http://www.amazon.com/SCJP-Certified-Programmer-Java-310-065/dp/0071591060/

Le programme que vous avez écrit n’a en fait pas besoinsynchronisation car il n'y a qu'un seul thread (principal). Je sais que vous essayez juste vos mains, donc donner quelques idées. Même si vous avez correctement appelé la méthode wait sur args (args.wait ()) ou synchronisé sur Thread.currentThread, votre thread peut passer en attente indéfinie (rendant votre programme instable) car il n'y a pas d'autre thread pour notifier votre thread principal.