Pregunta Java: dos hilos y una variable compartida

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

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

public class Prueba extends Thread {
    static String cadena = "hola";
    public static void main(String argv[]) {
        Prueba t = new Prueba();
        t.inicia(cadena);
        System.out.println(cadena);
    }
    public void inicia(String aux) {
        cadena = aux + " mundo ";
        start();
    }
    public void run() {
        for (int i=0; i<4; i++) { cadena = cadena + " " + i; }
    }
}
  1. imprime "hola mundo"
  2. imprime "hola mundo 0 1 2 3"
  3. El resultado es impredecible.
Ver la respuesta

Respuesta: 3.

300 ejecuciones, contadas con uniq -c300 hola mundo

inicia() cambia la cadena a "hola mundo " y arranca un hilo nuevo; el hilo principal sigue y hace el println sin esperar a que el otro termine. Los dos hilos usan la misma variable estática sin ninguna sincronización, así que nada garantiza qué parte del bucle habrá hecho el segundo hilo cuando el primero imprima, ni siquiera que vea sus cambios.

¿Y la salida? En 300 ejecuciones salió siempre hola mundo : arrancar un hilo tarda bastante más que llegar al println. Pero eso es una casualidad del momento, no una garantía, y con otra máquina o con el sistema cargado podría salir otra cosa. Precisamente por eso la respuesta correcta es la 3: que un error de concurrencia no aparezca en las pruebas no significa que no exista. Para esperar al hilo se usa t.join() antes de imprimir.

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.

45 comentarios en «Pregunta Java: dos hilos y una variable compartida»

  1. segun mi cerebro el resultado es "hola mundo 3" jajaja es q el primero no es puesto q si entra al ciclo for le va a poner 3 a la cadena … y el segundo tampoco es puesto q no andas mandando a imprimir asi.. jaja

    Responder
  2. Opcion 3, depende totalmente de la JVM, la razon por la cual parece ser la opcion 1 la correcta es porque casi siempre imprime "Hola mundo" y ya, pero si le dan un milisegundo de ventaja al run (cosa de la cual esta a cargo la JVM) este hilo gana al main con el System.out.println(cadena); e imprime "Hola mundo 0123"

    Responder
  3. Opcion 3 :3 y no se peleen los hilos son imprescindibles si se fijan bien al terminar inicia se lanza el hilo (ojo esto no significa que se ejecutara inmediatamente) entonces se lanza el hilo y se muestra la cadena es posible que la cadena se muestre antes que se se ejecute run, al decir es posible no podemos estar 100% seguros </3

    Responder

Deja un comentario