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);
}
}- La compilación falla.
- Imprime
"Hola". - Una
IllegalMonitorStateExceptiones lanzada en tiempo de ejecución. - 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().
Más preguntas de Java
- El orden de un HashSet
- start() con un argumento
- Dos hilos y una variable compartida
- wait() fuera de synchronized
- Leer más allá del final de un archivo
- binarySearch con null
- Serializar una clase cuyo padre no es Serializable
- Clases internas anidadas
- Llamar a run() en vez de start()
- Un assert que nunca falla
- HashSet sin equals ni hashCode
- Campos transient al serializar
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.
Causa una java.lang.IllegalMonitorStateException, a menos que lo cambies así – synchronized (mensaje)