Tengo una pregunta sobre la publicación El bloque sincronizado no funciona, el siguiente código está imprimiendo "Hola Java" ... 20 veces para obj1 y obj2. Este código es similar al que aparece en la publicación.

Según la explicación, ¿no debería el siguiente código también tener una salida variable? ¿Puede alguien ayudarme a entender la diferencia entre los dos?

class ThreadDemo implements Runnable 
{ 
    String x, y; 
    public void run() 
    { 
        for(int i = 0; i < 10; i++) 
            synchronized(this) 
            { 
                x = "Hello"; 
                y = "Java"; 
              System.out.print(x + " " + y + " ");
            } 
    }

    public static void main(String args[]) 
    { 
        ThreadDemo run = new ThreadDemo (); 
        Thread obj1 = new Thread(run); 
        Thread obj2 = new Thread(run); 
        obj1.start(); 
        obj2.start(); 
    } 
}
-2
Ankita 2 ene. 2020 a las 19:01

2 respuestas

La mejor respuesta

Solo imprime x y y que están en el bloque synchronized, por lo que imprime el mismo valor. Agregue i, que es el bloque exterior synchronized, en la impresión y verá resultados variables.

class ThreadDemo implements Runnable 
{ 
    String x, y; 
    public void run() 
    {
        for(int i = 0; i < 10; i++) 
            synchronized(this)
            {
                x = "Hello";
                y = "Java";
              System.out.println(x + " " + y + " "+i);
            }
    }
    public static void main(String args[]) 
    { 
         ThreadDemo run = new ThreadDemo (); 
        Thread obj1 = new Thread(run); 
        Thread obj2 = new Thread(run); 
        obj1.start(); 
        obj2.start(); 
    } 
}
3
Code_Mode 2 ene. 2020 a las 16:16

Obtiene un bloqueo en la instancia de ThreadDemo en la que se llama a ese método run (). Dado que ambos hilos están usando el mismo objeto, el bloque Sincronizado está trabajando aquí.

0
Arun Kumar 2 ene. 2020 a las 16:15