Pregunta Java: wait() sin el monitor correcto

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.

Pregunta Java: el orden de un HashSet

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

Pregunta Java · Collections

¿Cuál es el resultado de ejecutar el siguiente código?

import java.util.HashSet;
import java.util.Set;

public class Test {
    static void imprime(Set<? extends String> set) {
        for (String elemento : set) {
            System.out.format("%s ", elemento);
        }
    }
    public static void main(String[] args) {
        Set<String> set = new HashSet<String>();
        set.add("A");
        set.add("J");
        set.add("A");
        set.add("X");
        imprime(set);
    }
}
  1. imprime "A J A X"
  2. imprime "A J X"
  3. La salida no puede ser determinada
Ver la respuesta

Respuesta: 3.

java TestA X J

Un HashSet no guarda duplicados, así que la segunda "A" se descarta y quedan tres elementos. Pero no garantiza ningún orden: los coloca según su hashCode, y en nuestra ejecución salió A X J, que no es el orden en que se añadieron ni el alfabético. La documentación ni siquiera garantiza que ese orden se mantenga a lo largo del tiempo.

Si necesitas que salgan en el orden en que se insertaron, usa LinkedHashSet; si los quieres ordenados, TreeSet.

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.