Pregunta Java: wait() sin el monitor correcto

2 min de lectura

Piensa la respuesta antes de abrirla. Todas las opciones parecen razonables, y casi siempre hay un detalle que lo cambia todo.

Pregunta Java · Threads

¿Qué sucederá al tratar de compilar y ejecutar el siguiente código?

public class Test {

    public static void main(String[] args) {
        String mensaje = "Hola";
        synchronized (args) {
            try {
                mensaje.wait();
            } catch (InterruptedException e) {
            }
        }
        System.out.println(mensaje);
    }
}
  1. La compilación falla.
  2. Imprime "Hola".
  3. Una IllegalMonitorStateException es lanzada en tiempo de ejecución.
  4. Nada se imprime, el thread principal solo espera en la línea 7.
Ver la respuesta

Respuesta: 3.

java TestException in thread "main" java.lang.IllegalMonitorStateException: current thread is not owner
	at java.base/java.lang.Object.wait0(Native Method)
	at java.base/java.lang.Object.wait(Object.java:389)
	at java.base/java.lang.Object.wait(Object.java:351)
	at Test.main(Test.java:7)

Compila sin problemas: wait() es un método de Object y cualquier objeto lo tiene. El fallo llega al ejecutar. Para llamar a wait() sobre un objeto, el hilo tiene que tener el monitor de ese mismo objeto, y aquí tiene el de args, no el de mensaje. Estar dentro de un bloque synchronized no basta: tiene que ser synchronized (mensaje).

La trampa está en la opción 4: con el monitor correcto, el hilo sí se quedaría esperando para siempre en la línea 7, porque nadie llama a notify().

Pregunta publicada en 2013 y revisada en octubre de 2026. La respuesta se comprobó compilando y ejecutando el código con Java 25 LTS en un contenedor limpio; las salidas están copiadas de esa ejecución.

1 comentario en «Pregunta Java: wait() sin el monitor correcto»

Deja un comentario