/ / IllegalMonitorStateException en el código: java, multihilo, illegalmonitorstateexcep

IllegalMonitorStateException en código: java, subprocesos múltiples, illegalmonitorstateexcep

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..");
}

}
}

estoy obteniendo IllegalMonitorStateException excepción de monitor en este código. Según mi entendimiento, debido al bloqueo sincronizado alrededor args que es el objeto de matriz de cadena, el subproceso actual debe haber adquirido el bloqueo y con el método de espera, libero el bloqueo.

¿Puede alguien explicarme la razón detrás de esta excepción?

Respuestas

4 para la respuesta № 1

Estas llamando wait() en Thread.currentThread(). Antes de llamar wait() En cualquier objeto, debes poseer el monitor. de este objeto, a modo de sincronización sincronizada de bloques. en este objeto. Entonces, lo que falta es

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

Dicho esto, llamando wait() en un objeto Thread no es algo que debas hacer, y probablemente demuestre que no has entendido lo que wait() Sí, especialmente porque no tienes ningún otro subproceso de llamada. notify() o notifyAll(). Sincronizar en los argumentos pasados ​​al método principal también es una opción muy extraña. wait() es un método de muy bajo nivel que rara vez se debe utilizar, incluso si comprende completamente lo que hace. Para una mejor respuesta, debe explicar lo que realmente quiere que haga este código.


3 para la respuesta № 2

De IllegalMonitorStateException documentación

Se lanza para indicar que un subproceso ha intentado esperar en el monitor de un objeto o para notificar a otros subprocesos que esperan en el monitor de un objeto sin poseer el monitor especificado

De Object#notify() documentación

Un hilo se convierte en el propietario del monitor del objeto de una de estas tres formas:

  • Ejecutando un método de instancia sincronizada de ese objeto.
  • Ejecutando el cuerpo de una instrucción sincronizada que se sincroniza en el objeto.
  • Para objetos de tipo Clase, ejecutando un método estático sincronizado de esa clase.

Así que ya que el hilo está ejecutando bloque sincronizado en args objeto

synchronized (args) {
//...
}

deberías llamar args.wait() en lugar Thread.currentThread().wait(); .


0 para la respuesta № 3

Hola, ankit, asumo que estás tratando de aprender algunos conceptos básicos de multihilo. tratar de conseguir algunos buenos tutoriales en línea:http://www.javaworld.com/jw-04-1996/jw-04-threads.html

o prueba algún buen libro básico. http://www.amazon.com/SCJP-Certified-Programmer-Java-310-065/dp/0071591060/

El programa que escribiste en realidad no necesitasincronización ya que solo hay un hilo (principal). Sé que solo estás probando tus manos, por lo tanto, estás dando algunas ideas. Incluso si ha llamado correctamente al método de espera en args (args.wait ()) o sincronizado en Thread.currentThread, su hilo puede tener una espera indefinida (haciendo que su programa no responda) porque no hay otro hilo para notificar a su hilo principal.