Pregunta Java: wait() fuera de synchronized

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

Pregunta Java · Threads

¿Cuál es el resultado de compilar y ejecutar el siguiente código? ¿Y por qué?

public class Prueba {
    public static void main(String[] args) {
        String mensaje = "Saludos";
        try {
            mensaje.wait();
        } catch (InterruptedException e) {
        }
        System.out.println("mensaje: " + mensaje);
    }
}
  1. La compilación falla.
  2. Se lanza una IllegalMonitorStateException en tiempo de ejecución.
  3. No se imprime nada, espera indefinidamente.
  4. Se imprime "mensaje: Saludos"
Ver la respuesta

Respuesta: 2.

java PruebaException 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 Prueba.main(Prueba.java:5)

wait() hace que el hilo espere hasta que otro llame a notify() o notifyAll() sobre el mismo objeto, y solo se puede llamar teniendo su monitor, es decir, dentro de un synchronized (mensaje) {…}. Aquí no hay ningún bloque synchronized, así que compila pero falla al ejecutar.

Es la hermana de otra pregunta en la que sí hay synchronized, pero sobre el objeto equivocado. Hoy rara vez se usan wait y notify directamente: java.util.concurrent tiene herramientas más seguras, como CountDownLatch o las colas bloqueantes.

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.

2 comentarios en «Pregunta Java: wait() fuera de synchronized»

Deja un comentario